是否可以在一行中初始化具有增加值的向量?

时间:2016-04-18 15:12:59

标签: c++ c++11 initializer-list

是否可以借助初始化列表或其他C ++功能将两个初始化行合并为单个语句?

表示矢量值始终以1递增,但n的大小不固定。

#include <numeric>
#include <vector>
#include <iostream>

int main()
{
    int n = 10;

    // Can the two lines below be combined into a single statement?
    std::vector<int> v(n);
    std::iota(v.begin(), v.end(), 1);

    for (int i : v)
        std::cout << i << std::endl;

    return 0;
}

2 个答案:

答案 0 :(得分:12)

您可以使用Boost.counting_iterator

std::vector<int> v(boost::counting_iterator<int>(1),
                    boost::counting_iterator<int>(n + 1));

Live)现在,这是否值得,比现有的更容易阅读。

答案 1 :(得分:6)

不是,不。如果n是一个运行时变量,那么你可能做的最好就是把它放在某个函数中:

std::vector<int> ints(int n) {
    std::vector<int> v;
    v.reserve(n);
    for (int i = 0; i < n; ++i) {
        v.push_back(n+1);
    }
    return v;
}

// now it's one line?
std::vector<int> v = ints(n);

如果是编译时间,您可以使用std::index_sequence提供初始化列表:

template <int... Is>
std::vector<int> ints(std::integer_sequence<int, Is...> ) {
    return std::vector<int>{ (Is+1)... };
}


template <int N>
std::vector<int> ints() {
    return ints(std::make_integer_sequence<int, N>{});
}

但不管怎样,你需要一个辅助函数。