相关疑难解决方法(0)

C++ 11中是否有一个范围类用于基于范围的循环?

我发现自己刚刚写了这篇文章:

template <long int T_begin, long int T_end>
class range_class {
 public:
   class iterator {
      friend class range_class;
    public:
      long int operator *() const { return i_; }
      const iterator &operator ++() { ++i_; return *this; }
      iterator operator ++(int) { iterator copy(*this); ++i_; return copy; }

      bool operator ==(const iterator &other) const { return i_ == other.i_; }
      bool operator !=(const iterator &other) const { return i_ != other.i_; }

    protected:
      iterator(long int start) : i_ (start) { } …
Run Code Online (Sandbox Code Playgroud)

c++ std c++11

99
推荐指数
3
解决办法
4万
查看次数

基于范围的语句定义冗余

查看n3092,在§6.5.4中,我们找到了基于范围的for循环的等价性.然后它继续说什么__begin和__end等于.它区分了数组和其他类型,我觉得这是多余的(也就是令人困惑).

它表示数组类型__begin和__end你所期望的:指向第一个的指针和指向一个结尾的指针.那么对于其他类型的,__begin并__end等于begin(__range)和end(__range),与ADL.命名空间std是关联的,以便在第24.6.5节中找到std::begin并std::end定义<iterator>.

但是,如果我们看的定义std::begin和std::end,他们是阵列以及容器类型都定义.并且数组版本与上面完全相同:指向第一个的指针,指向一个结尾的指针.

为什么需要将数组与其他类型区分开来,当为其他类型提供的定义同样适用时,查找std::begin和std::end?


为方便起见,有些删节报价:

§6.5.4基于范围的for陈述

- 如果_RangeT是一个数组类型,则begin-expr和end-expr分别是__range和__range + __bound,其中__bound是数组绑定的.如果_RangeT是未知大小的数组或不完整类型的数组,则程序格式错误.

- 否则,begin-expr和end-expr分别是begin(__ range)和end(__ range),其中begin和end通过参数依赖查找(3.4.2)查找.出于此名称查找的目的,名称空间std是关联的名称空间.

§24.6.5范围访问

template <class T, size_t N> T* begin(T (&array)[N]);
Run Code Online (Sandbox Code Playgroud)

返回:数组.

template <class T, size_t N> T* end(T (&array)[N]);
Run Code Online (Sandbox Code Playgroud)

返回:数组+ N.

c++ for-loop range argument-dependent-lookup c++11

19
推荐指数
1
解决办法
3459
查看次数

是否有用于 C 字符串的标准 C++ 迭代器?

有时我需要使用通用 C++ 迭代器范围接口将 C 字符串传递给函数[first, last)。是否有适用于这些情况的标准 C++ 迭代器类,或者无需复制字符串或调用的标准方法strlen()?

编辑:我知道我可以使用指针作为迭代器,但我必须知道字符串在哪里结束,什么需要我调用strlen().

EDIT2:虽然我不知道这样的迭代器是否标准化,但我当然知道这是可能的。回应讽刺的答案和评论,这是存根(不完整,未经测试):

class CStringIterator
{
public:
    CStringIterator(char *str=nullptr):
        ptr(str)
    {}

    bool operator==(const CStringIterator& other) const
    {
        if(other.ptr) {
            return ptr == other.ptr;
        } else {
            return !*ptr;
        }
    }

    /* ... operator++ and other iterator stuff */

private:
    char *ptr;
};
Run Code Online (Sandbox Code Playgroud)

EDIT3:具体来说,我对前向迭代器感兴趣,因为我想避免在 sring 上迭代两次,因为我知道算法只需要执行一次。

c++ string iterator c++11

5
推荐指数
2
解决办法
1813
查看次数

如何在char*argv []上执行基于范围的c ++ 11 for循环?

我想尝试基于c ++ 11 range-based for loop,char* argv[]但是我遇到了错误.目前的方法是:

for( char* c : argv )
{                                                                                               
   printf("param: %s \n", c);                                                                    
}
Run Code Online (Sandbox Code Playgroud)

在我的makefile中,我有以下行:

g++ -c -g -std=c++11 -O2 file.cc
Run Code Online (Sandbox Code Playgroud)

for-loop range c++11

4
推荐指数
1
解决办法
1229
查看次数