しかし、どのように1はするだろう:std::generate()
に代わり
x = range(0,20,2)
を(他の回答を参照してください)、あなたはstd::iota()
に独自の単項機能を提供することができ、それだけでoperator++()
と呼ばれるように持っています:
#include <iostream>
#include <functional>
#include <numeric>
#include <vector>
template<class T>
struct IotaWrapper
{
typedef T type;
typedef std::function<type(const type&)> IncrFunction;
type value;
IncrFunction incrFunction;
IotaWrapper() = delete;
IotaWrapper(const type& n, const IncrFunction& incrFunction) : value(n), incrFunction(incrFunction) {};
operator type() { return value; }
IotaWrapper& operator++() { value = incrFunction(value); return *this; }
};
int main()
{
IotaWrapper<int> n(0, [](const int& n){ return n+2; });
std::vector<int> v(10);
std::iota(v.begin(), v.end(), n);
for (auto i : v)
std::cout << i << ' ';
std::cout << std::endl;
}
出力:0 2 4 6 8 10 12 14 16 18
Demo
ここでは、1つのRange()
を実装する方法のアイデアです:
あなたは `のstdを使用することができます
struct Range
{
template<class Value, class Incr>
std::vector<Value> operator()(const Value& first, const Value& last, const Incr& increment)
{
IotaWrapper<Value> iota(first, [=](const int& n){ return n+increment; });
std::vector<Value> result((last - first)/increment);
std::iota(result.begin(), result.end(), iota);
return result;
}
};
Demo
出典
2015-12-31 11:04:52
YSC
::変換する'もしあなたがベクトル上で他の操作をしたいならば。 –
参照してくださいhttp://stackoverflow.com/q/1977339/2301450 – vaultah
std :: generateを見てくださいが、要点は、C++の本当にエレガントな標準ライブラリソリューションがまだないことです。 – MikeMB