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

时间:2012-01-13 18:11:24

标签: c++ stl initialization std stdvector

我想使用一种特殊的方法来初始化std::vector<unsigned int>,这在我用作参考的C ++书中有所描述(如果重要的话,由Ulrich Breymann撰写的德语书“Der C ++ Programmer”)。该书中有关于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)

我想以unsigned int的间隔使用第二个,即

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

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

5 个答案:

答案 0 :(得分:20)

至少有三种方法可以做到这一点。 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);

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

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

答案 1 :(得分:10)

重读附近的段落,描述每个参数是什么。具体来说,应该提到ij不是值,而是迭代器。此构造函数通常用于制作其他类型容器的副本。如果您想获得一系列值,Boost library会提供counting iterator,这正是您想要的。

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

答案 2 :(得分:3)

使用自增量迭代器执行此操作的非增强方法。

#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;
    }
}

答案 3 :(得分:2)

C ++ 11:

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

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

答案 4 :(得分:1)

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

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

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