是否可以借助初始化列表或其他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;
}
答案 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>{});
}
但不管怎样,你需要一个辅助函数。