我有一个简单的任务,即使用一系列整数初始化std::vector<int>
。
范围由用户给出,我尽量避免使用for
循环。
类似的东西:
void addRange(std::vector<int>& vReturn, int nStart, int nEnd)
{
vReturn.clear();
// straightforward solution
for (int nInteger = nStart; nInteger <= nEnd; nInteger++)
{
vReturn.push_back(nInteger);
}
//////////////////////////////////////////////
// Elegent Pseudo-Code
vReturn.add_range(nStart, nEnd); // <<- is this doable?
}
答案 0 :(得分:9)
您可以使用算法iota在C ++ 11中执行此操作。
vReturn.clear();
vReturn.resize((nEnd - nStart) + 1);
std::iota(vReturn.begin(), vReturn.end(), nStart);
您也可以使用boost::irange。
auto range = boost::irange<int>(nStart, nEnd + 1);
vReturn.assign(range.begin(), range.end());
答案 1 :(得分:0)
我有一个替代解决方案,它不使用for循环,不使用boost或C ++ 11
#include <iostream>
#include <vector>
using namespace std;
struct Add{
void operator()(int x, int y, vector<int>& vec)
{
if(x > y)
return;
vec.push_back(x);
operator()(++x, y, vec);
}
};
void addRange(std::vector<int>& vReturn, const int nStart, const int nEnd)
{
vReturn.resize(nEnd - nStart);
vReturn.clear();
Add()(nStart, nEnd, vReturn); //update the vector using Functor object
}
int main()
{
vector<int> vec;
int start = 1, end = 10;
addRange(vec, start , end);
return 0;
}