C++ 是否有一种在C+中为范围(100)内的i编写代码的短方法+;?

C++ 是否有一种在C+中为范围(100)内的i编写代码的短方法+;?,c++,initializer-list,C++,Initializer List,如果我做对了,我可以使用它在固定范围内迭代: for(inti:{1,2,3,4,5}) 做某事(我); 这是同样的事情: 向量v{1,2,3,4,5}; 对于(int i:v) 做某事(我); 但是,如果我想在1,…,100的范围内迭代,并且在编译时已经知道了,该怎么办? 最漂亮的方法是什么? 什么是最有效的? 最短的是什么 编辑:当然我可以编写一个常规的for循环,但是实际的用例将涉及比ints更复杂的内容 我只是把这个例子简化了一点。for(int I=1;I如果你真的想把它放在一个容

如果我做对了,我可以使用它在固定范围内迭代:

for(inti:{1,2,3,4,5})
做某事(我);
这是同样的事情:

向量v{1,2,3,4,5};
对于(int i:v)
做某事(我);
但是,如果我想在1,…,100的范围内迭代,并且在编译时已经知道了,该怎么办? 最漂亮的方法是什么? 什么是最有效的? 最短的是什么

编辑:当然我可以编写一个常规的for循环,但是实际的用例将涉及比
int
s更复杂的内容


我只是把这个例子简化了一点。

for(int I=1;I如果你真的想把它放在一个容器中,你可以使用这个函数来填充一个容器。否则,使用一个普通的
for
循环。

你可以“轻松”编写一个代表整数范围的与范围兼容的类。你只需要为它编写迭代器

for( int i = 1; i <= 100; ++i )
{
    do_sth( i );
}

或者您可以使用,正是这样。

使用函数模板的范围:

namespace detail
{
    template <int... Is>
    struct index { };

    template <int N, int... Is>
    struct gen_seq : gen_seq<N - 1, N - 1, Is...> { };

    template <int... Is>
    struct gen_seq<0, Is...> : index<Is...> { };
}

template <int... Is>
std::array<int, sizeof...(Is)> range(detail::index<Is...>)
{
    return {{ Is... }};
}

template <int N>
std::array<int, N> range()
{
    return range(detail::gen_seq<N>{});
}
名称空间详细信息
{
模板
结构索引{};
模板
结构gen_seq:gen_seq{};
模板
结构gen_seq:索引{};
}
模板
std::数组范围(详细信息::索引)
{
返回{{Is…}};
}
模板
std::数组范围()
{
返回范围(细节::gen_seq{});
}
例如:

for (auto i : range<5>())
{
    do_sth(i);
}
for(自动i:range())
{
做某事(我);
}
#包括
#包括
#包括
#包括
使用名称空间std;
向量运算符“”\r(常量字符*文本,常量大小)
{
字符串txt(文本);
auto delim=txt.find('-');
auto first=txt.substr(0,delim);
自动秒=txt.substr(delim+1);
int lower=stoi(第一);
int上限=stoi(秒);
向量rval(上-下);
生成(rval.begin(),rval.end(),[&]{return lower++;});
返回rval;
}
int main()
{
用于(自动和el:“10-100”\r)

cout基于迭代器的技术示例,如Sebastian Redl所述:

class range {
public:
    struct rangeIt{
        rangeIt(int v) : _v(v){}
        int operator*()const{return _v;}
        void operator++(){_v++;}
        bool operator!=(const rangeIt & other)const{ return _v != other._v;}
    private:
        int _v;
    };
    range(int a, int b):_a(a),_b(b){}
    rangeIt begin() const { return rangeIt(_a); }
    rangeIt end() const { return rangeIt(_b); }
private:
    int _a, _b;
};
然后可以这样使用:

for(int i : range(0, 100)) {
  printf("%d\n", i);
}

或者你可以使用宏,但它们是邪恶的,所以是的。实际上,你可以在编译时使用模板递归生成范围,但这只适用于POD类型,并且你会受到编译器最大模板递归的限制allows@black_puppydog你的编辑比你想象的更能改变问题。真实情况是什么?@BoBTF实际上我想迭代一个预先定义的STL对象的列表/向量,但是我想我会写一个简单的迭代器来完成这个任务,因为它实际上更适合我。我想我希望有一些自动的,但是我认为用C++我不会得到这样的结果:D对于混乱感到抱歉。请看@ Khurshid Normuradov的解决方案。萨尔维亚:这个问题问的是美丽,而不仅仅是效率。
iota
是一个美丽的词。@MikeSeymour-是的,真的很美丽的词:D-它还问“最短”和“最高效”ways@MikeSeymour我也喜欢这个词,特别是如果翻译成瑞典语,它就是“jota”,可以用作“inteettjota”,意思是“绝对没什么”。简单就是美丽Andrew Koenig对不对称边界的乐趣有很多要说的。但是,是的,就这么做。@black_puppydog-这完全改变了情况。这就成了一个完全不同的问题。+1-我更喜欢这个简单代码的更详细可读性,而不是不为人所知的复杂的简短结构(目前)“这是最新的C++程序员可以阅读的。”基里基洛夫同意,这里的事情变化很快,实验的代码为下一个家庭作业和不同的算法。在一个小元:如何继续?关闭问题?特别有用的范围像1…100000等。.@DieterLücking我相信有人会想出办法的。:)
for(int i : range(0, 100)) {
  printf("%d\n", i);
}