使用连续无符号整数列表初始化std :: vector <unsigned int>

Tho*_*mas 9 c++ stl initialization std stdvector

我想使用一种特殊的方法来初始化一个std::vector<unsigned int>我在其中作为参考的C++书籍中描述的内容(德国着作"Ulrich Breymann的Der C++ Programmer",如果重要的话).在这本书是关于序列类型的STL的部分,特别是指list,vectordeque.在本节中,他写道,这种序列类型有两个特殊的构造函数,即,如果X引用这样的类型,

X(n, t) // creates a sequence with n copies of t
X(i, j) // creates a sequence from the elements of the interval [i, j)
Run Code Online (Sandbox Code Playgroud)

我希望使用第二个间隔unsigned int,即

std::vector<unsigned int> l(1U, 10U);
Run Code Online (Sandbox Code Playgroud)

获取初始化的列表{1,2,...,9}.然而,我得到的是一个unsigned int值为10 的向量: - | 第二个变体是否存在,如果存在,我该如何强制它被调用?

Man*_*far 20

至少有三种方法可以做到这一点.Brian先前提到过一个

//method 1
generate(v.begin(), v.end(), [] { static int i {1}; return i++; });     
Run Code Online (Sandbox Code Playgroud)

如果使用的是c ++ 11,也可以使用std :: iota

//method 2
iota(v.begin(), v.end(), 1);
Run Code Online (Sandbox Code Playgroud)

或者您可以使用1s初始化容器,然后对其进行部分求和.我认为没有人会使用这第三种方法:)

//method 3
vector<int> v(n, 1);                                                     
partial_sum(v.begin(), v.end(), v.begin()); 
Run Code Online (Sandbox Code Playgroud)


Moo*_*uck 10

重读那里附近的段落,描述每个参数是什么.具体来说,它应该提到i并且j不是值,而是迭代器.此构造函数通常用于制作其他类型容器的副本.如果你想获得一系列值,Boost库提供了一个计数迭代器,它完全符合你的要求.

std::vector<unsigned int> numbers(
     boost::counting_iterator<unsigned int>(0U),
     boost::counting_iterator<unsigned int>(10U));
Run Code Online (Sandbox Code Playgroud)