繁体   English   中英

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

[英]Initialization of std::vector<unsigned int> with a list of consecutive unsigned integers

我想使用一种特殊的方法来初始化一个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: - | 第二个变体是否存在,如果存在,我该如何强制它被调用?

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

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

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

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

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

C ++ 11:

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM