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

9

我想使用一种特殊的方法来初始化一个std::vector<unsigned int>,这在我参考的一本C++书籍(德国作者Ulrich Breymann的《C++程序员》)中有所描述。该书有一节介绍STL的序列类型,特别是listvectordeque。在这一节中,作者写道,这些序列类型有两个特殊的构造函数,即,如果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)

我希望用第二种方法来表示一个无符号整数的区间,即

std::vector<unsigned int> l(1U, 10U);

我希望得到一个以{1,2,...,9}初始化的列表。但是我实际得到的是一个只有一个值为10的unsigned int向量 :-| 是否存在第二种变体,如果存在,如何强制调用它?

5个回答

21

你至少有三种方法可以做到这一点。其中一种方法是Brian之前提到的。

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

如果你使用c++11,你也可以使用std::iota。

//method 2
iota(v.begin(), v.end(), 1);

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

//method 3
vector<int> v(n, 1);                                                     
partial_sum(v.begin(), v.end(), v.begin()); 

如果您想生成包含累加和的数组,那么方法3非常方便。只需添加另一个 partial_sum(v.begin(), v.end(), v.begin()),当n = 5时,您将得到{1, 3, 6, 10, 15}。 - lifebalance
注意,这里的generate使用静态变量。将其放入函数中,多次调用它将会保持计数。请使用ValueType i = {1}; std::generate(first, last, [&i] { return i++; });代替。 - Anne van Rossum

10

请重新阅读附近的段落,了解每个参数分别是什么。具体来说,它应该提到 ij 不是值,而是迭代器。这个构造函数非常常用于复制其他类型的容器。如果你想要获取一系列的值,Boost 库 提供了一个计数迭代器,它正好可以满足你的需求。

std::vector<unsigned int> numbers(
     boost::counting_iterator<unsigned int>(0U),
     boost::counting_iterator<unsigned int>(10U));

谢谢,按预期工作!这本书在特定构造函数方面有点不明确,但后来字母i、j实际上被明确用于迭代器。Th. - Thomas

3
使用一个自增迭代器的非boost方式来实现这一点。
#include <vector>
#include <iostream>
#include <algorithm>

static int NUM_ITEMS = 10;

class gen_range {
    public:
        gen_range(int i) { idx = i; }
        int operator()() { return (idx++); };

    int idx;
};

int main() {

    std::vector<int> x(NUM_ITEMS);
    std::generate_n(x.begin(), NUM_ITEMS, gen_range(0));

    for (int i=0; i < x.size(); i++) {
        std::cout << x[i] << std::endl;
    }
}

2

不,该变量不存在。第二个构造函数从指向另一个序列的两个迭代器初始化向量。

以下是“两个迭代器”构造函数的示例:

int fill_data[4] = { 1, 2, 3, 4 };
std::vector<int> v(fill_data, fill_data + 4);

感谢您的编辑请求,我错误地将其标记为不正确。 :) 我已经修复了它。 - Brian Neal

2

C++11:

std::vector<int> idxs (n);

std::generate_n (idxs.begin (), n, [] { static int i {1}; return i++; });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接