104

vector<int>using を入力したいのですstd::fillが、1 つの値ではなく、ベクトルには後に昇順で数字が含まれている必要があります。

関数の 3 番目のパラメーターを 1 ずつ繰り返すことでこれを達成しようとしましたが、これは 1 または 2 で満たされたベクトルしか得られません (++オペレーターの位置によって異なります)。

例:

vector<int> ivec;
int i = 0;
std::fill(ivec.begin(), ivec.end(), i++); // elements are set to 1
std::fill(ivec.begin(), ivec.end(), ++i); // elements are set to 2
4

16 に答える 16

54
于 2013-07-17T08:20:32.990 に答える
4

std::iota はシーケンス n、n+1、n+2、... に制限されています

しかし、一般的なシーケンス f(0)、f(1)、f(2) などで配列を埋めたい場合はどうなるでしょうか? 多くの場合、状態追跡ジェネレーターを回避できます。例えば、

int a[7];
auto f = [](int x) { return x*x; };
transform(a, a+7, a, [a, f](int &x) {return f(&x - a);});

正方形のシーケンスを生成します

0 1 4 9 16 25 36

ただし、このトリックは他のコンテナーでは機能しません。

C++98 に行き詰まっている場合は、次のような恐ろしいことを行うことができます。

int f(int &x) { int y = (int) (long) &x / sizeof(int); return y*y; }

その後

int a[7];
transform((int *) 0, ((int *) 0) + 7, a, f);

しかし、私はそれをお勧めしません。:)

于 2014-05-10T00:37:15.707 に答える
2

ブーストといえば:

auto ivec = boost::copy_range<std::vector<int>>(boost::irange(5, 10));
于 2015-06-30T16:51:10.667 に答える
2

this also works

j=0;
for(std::vector<int>::iterator it = myvector.begin() ; it != myvector.end(); ++it){
    *it = j++;
}
于 2013-07-17T08:23:26.983 に答える
1

これは古い質問であることは知っていますが、現在、この問題を正確に処理するためにライブラリで遊んでいます。C++14 が必要です。

#include "htl.hpp"

htl::Token _;

std::vector<int> vec = _[0, _, 100];
// or
for (auto const e: _[0, _, 100]) { ... }

// supports also custom steps
// _[0, _%3, 100] == 0, 4, 7, 10, ...
于 2016-10-24T13:04:05.933 に答える