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

Chi*_*iel 3 c++ initializer-list c++11

是否可以借助初始化程序列表或其他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;
}
Run Code Online (Sandbox Code Playgroud)

Bau*_*gen 12

你可以使用Boost.counting_iterator:

std::vector<int> v(boost::counting_iterator<int>(1),
                    boost::counting_iterator<int>(n + 1));
Run Code Online (Sandbox Code Playgroud)

(现场)现在,这是否值得,比您已经拥有的更容易阅读,供您决定.

  • 鉴于提升不是真正的C++"功能",这几乎是一个临界答案.但是,再次,它是提振. (2认同)

Bar*_*rry 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);
Run Code Online (Sandbox Code Playgroud)

如果是编译时间,您可以使用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>{});
}
Run Code Online (Sandbox Code Playgroud)

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