在C++中n = {0,1,...,n-1}

Mig*_*uel 0 c++ set-theory c++14

自然数n的形式定义(在集合论中)如下:

  • 0是空集
  • 1 = {0}
  • n = {0,1,...,n-1}

我认为这会使一些C++代码更简单,如果我被允许这样做:

for (int n : 10)
    cout << n << endl;
Run Code Online (Sandbox Code Playgroud)

它打印的数字从0到9.

所以我尝试执行以下操作,但不编译:

#include <iostream>
#include <boost/iterator/counting_iterator.hpp>


    boost::counting_iterator<int> begin(int t)
    {
        return boost::counting_iterator<int>(0);
    }

    boost::counting_iterator<int> end(int t)
    {
        return boost::counting_iterator<int>(t);
    }



int main() 
{
    for (int t : 10)
        std::cout << t << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

有关如何实现这一目标的任何建议?我用clang ++得到以下错误:

main.cpp:22:20: error: invalid range expression of type 'int'; no viable 'begin' function available
        for (int t : 10)
                ^ ~~
Run Code Online (Sandbox Code Playgroud)

但我想我应该被允许这样做!:)

编辑:我知道如果我在for循环中添加"range"(或其他一些单词)这个词,我可以"伪造"它,但我想知道是否可以不使用它.

Mar*_*ica 10

它无法完成.从C++ 14标准草案的 6.5.4节(但C++ 11将非常相似)

begin-expr和end-expr确定如下:

(1.1) - 如果_ RangeT是数组类型,[...];

嗯,这个显然不适用.An int不是数组

(1.2) - 如果_RangeT是类类型,[...]

不,这也不适用.

(1.3) -否则,开始-EXPR和最终EXPR是begin(__range)和end(__range)分别

哦哦!这看起来很有希望.您可能需要移动begin并end进入全局命名空间,但仍然......

在相关名称空间中查找begin 和end查找的位置(3.4.2).[注意:不执行普通的非限定查找(3.4.1). - 结束说明]

(强调我的).烦!没有任何关联的命名空间int.具体来说,请参见第3.4.2节

- 如果T [ int在我们的例子中]是一个基本类型,它的相关命名空间和类集都是空的.

唯一的工作是编写一个range具有合适的开始和结束方法的类.然后你可以写出非常pythonic:

for (int i : range(5))
Run Code Online (Sandbox Code Playgroud)

  • 我认为范围(x)和范围(x,y)无论如何都是更好的语法 (3认同)