将std :: vector <int>设置为范围

And*_*eas 34 c++ stl stdvector iota c++11

设置std::vector<int>范围的最佳方法是什么,例如3到16之间的所有数字?

jua*_*nza 53

std::iota如果你有C++ 11支持或正在使用STL,你可以使用:

std::vector<int> v(14);
std::iota(v.begin(), v.end(), 3);
Run Code Online (Sandbox Code Playgroud)

或者如果没有实施自己的.

如果你可以使用boost,那么一个不错的选择是boost::irange:

std::vector<int> v;
boost::push_back(v, boost::irange(3, 17));
Run Code Online (Sandbox Code Playgroud)

  • @rhalbersma我不确定是否可以。只是在必要时更改向量的内部存储,但是iota需要有效的迭代器范围。 (2认同)
  • @rhalbersma然后什么时候`iota`会停止?没有办法告诉它"在N个数字后停止". (2认同)

Sin*_*all 19

std::vector<int> myVec;
for( int i = 3; i <= 16; i++ )
    myVec.push_back( i );
Run Code Online (Sandbox Code Playgroud)

  • 在这里做一个'myVec.reserve(14)`会更好. (4认同)
  • 啊,但这对于*真正的* C++ 来说有点太简单了。您的解决方案少于 20 行,并且不会触发 30 个带有拼写错误的神秘模板错误:)。不过,它将执行不需要的初始化,但我怀疑很少会感觉到差异...... (4认同)
  • +1 亲吻。你的也是唯一的答案(到目前为止)你可以清楚地看到代码中的范围(从 3 到 16 的循环)。其他的都使用 3(范围开始)和 14(元素数)。 (3认同)

Tem*_*Rex 8

参见例如这个问题

#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>

template<class OutputIterator, class Size, class Assignable>
void iota_n(OutputIterator first, Size n, Assignable value)
{
        std::generate_n(first, n, [&value]() {
                return value++;
        });
}

int main()
{
    std::vector<int> v;                   // no default init
    v.reserve(14);                        // allocate 14 ints
    iota_n(std::back_inserter(v), 14, 3); // fill them with 3...16

    std::for_each(v.begin(), v.end(), [](int const& elem) {
        std::cout << elem << "\n";
    });
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Ideone上的输出