在C ++ / STL中是否有一个与Python范围()相当的压缩文件?

我如何使用C ++ / STL做以下的等价物? 我想填充一个std::vector的值范围[min,max)。

 # Python >>> x = range(0, 10) >>> x [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

我想我可以使用std::generate_n并提供一个函数来生成序列,但我想知道是否有一个更简洁的方式使用STL做到这一点?

在C ++ 11中,有std::iota

 std::vector<int> x(10); std::iota(std::begin(x), std::end(x), 0); //0 is the starting number 

有提升:: irange :

 std::vector<int> x; boost::push_back(x, boost::irange(0, 10)); 

boost::irange ,但它不提供浮点,负步骤,不能直接初始化stl容器。

在我的RO库中还有numeric_range

在RO中,初始化一个向量:

 vector<int> V=range(10); 

从doc页面( scc – c ++代码片段评估程序)中剪切 – 粘贴示例:

 // [0,N) open-ended range. Only range from 1-arg range() is open-ended. scc 'range(5)' {0, 1, 2, 3, 4} // [0,N] closed range scc 'range(1,5)' {1, 2, 3, 4, 5} // floating point scc 'range(1,5,0.5)' {1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5} // negative step scc 'range(10,0,-1.5)' {10, 8.5, 7, 5.5, 4, 2.5, 1} // any arithmetic type scc "range('a','z')" abcdefghijklmnopqrstu vwxyz // no need for verbose iota. (vint - vector<int>) scc 'vint V = range(5); V' {0, 1, 2, 3, 4} // is lazy scc 'auto NR = range(1,999999999999999999l); *find(NR.begin(), NR.end(), 5)' 5 // Classic pipe. Alogorithms are from std:: scc 'vint{3,1,2,3} | sort | unique | reverse' {3, 2, 1} // Assign 42 to 2..5 scc 'vint V=range(0,9); range(V/2, V/5) = 42; V' {0, 1, 42, 42, 42, 5, 6, 7, 8, 9} // Find (brute force algorithm) maximum of `cos(x)` in interval: `8 < x < 9`: scc 'range(8, 9, 0.01) * cos || max' -0.1455 // Integrate sin(x) from 0 to pi scc 'auto d=0.001; (range(0,pi,d) * sin || add) * d' 2 // Total length of strings in vector of strings scc 'vstr V{"aaa", "bb", "cccc"}; V * size || add' 9 // Assign to c-string, then append `"XYZ"` and then remove `"bc"` substring : scc 'char s[99]; range(s) = "abc"; (range(s) << "XYZ") - "bc"' aXYZ // Hide phone number: scc "str S=\"John Q Public (650)1234567\"; S|isdigit='X'; S" John Q Public (XXX)XXXXXXX 

我结束了写一些实用function来做到这一点。 你可以使用它们如下:

 auto x = range(10); // [0, ..., 9] auto y = range(2, 20); // [2, ..., 19] auto z = range(10, 2, -2); // [10, 8, 6, 4] 

代码:

 #include <vector> #include <stdexcept> template <typename IntType> std::vector<IntType> range(IntType start, IntType stop, IntType step) { if (step == IntType(0)) { throw std::invalid_argument("step for range must be non-zero"); } std::vector<IntType> result; IntType i = start; while ((step > 0) ? (i < stop) : (i > stop)) { result.push_back(i); i += step; } return result; } template <typename IntType> std::vector<IntType> range(IntType start, IntType stop) { return range(start, stop, IntType(1)); } template <typename IntType> std::vector<IntType> range(IntType stop) { return range(IntType(0), stop, IntType(1)); } 

我不知道有什么办法像python那样做,但另外一个select显然是通过它来循环:

 for (int i = range1; i < range2; ++i) { x.push_back(i); } 

克里斯的答案是更好的,但如果你有C + + 11

对于那些不能使用C ++ 11或库的人:

 vector<int> x(10,0); // 0 is the starting number, 10 is the range size transform(x.begin(),x.end(),++x.begin(),bind2nd(plus<int>(),1)); // 1 is the increment 

如果你不能使用C ++ 11,你可以使用std::partial_sum来产生从1到10的数字。如果你需要从0到9的数字,你可以使用transform来减去1:

 std::vector<int> my_data( 10, 1 ); std::partial_sum( my_data.begin(), my_data.end(), my_data.begin() ); std::transform(my_data.begin(), my_data.end(), my_data.begin(), bind2nd(std::minus<int>(), 1)); 

多年来,我一直在使用这个库:

https://github.com/klmr/cpp11-range

工作得很好,代理被优化了。

 for (auto i : range(1, 5)) cout << i << "\n"; for (auto u : range(0u)) if (u == 3u) break; else cout << u << "\n"; for (auto c : range('a', 'd')) cout << c << "\n"; for (auto i : range(100).step(-3)) if (i < 90) break; else cout << i << "\n"; for (auto i : indices({"foo", "bar"})) cout << i << '\n'; 

范围()函数类似于下面的将有助于:

 #include <algorithm> #include <iostream> #include <numeric> #include <vector> using namespace std; // define range function (only once) template <typename T> vector <T> range(T N1, T N2) { vector<T> numbers(N2-N1); iota(numbers.begin(), numbers.end(), N1); return numbers; } vector <int> arr = range(0, 10); vector <int> arr2 = range(5, 8); for (auto n : arr) { cout << n << " "; } cout << endl; // output: 0 1 2 3 4 5 6 7 8 9 for (auto n : arr2) { cout << n << " "; } cout << endl; // output: 5 6 7