15

std::vector に重要な初期値 (シーケンス番号など) を入力する方法を知っています。

void IndexArray( unsigned int length, std::vector<unsigned int>& v )
{
    v.resize(length);
    for ( unsigned int i = 0; i < length; ++i )
    {
        v[i] = i;
    }
}

しかし、これは for ループです。stl 機能を使用して (Boost を使用せずに)より少ないコード行でこれを行うエレガントな方法はありますか?

4

6 に答える 6

15

コンテナを埋めるより一般的な方法として、generate アルゴリズムを使用できます。

#include <iostream>
#include <algorithm>
#include <vector>

struct c_unique {
   int current;
   c_unique() {current=0;}
   int operator()() {return ++current;}
} UniqueNumber;


int main () {
  vector<int> myvector (8);
  generate (myvector.begin(), myvector.end(), UniqueNumber);

  cout << "\nmyvector contains:";
  for (vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
    cout << " " << *it;

  cout << endl;

  return 0;
}

これはcplusplusreferenceから恥知らずに持ち上げて編集したものです。

于 2008-10-16T08:28:10.187 に答える
5

私は通常、std::generateプラスの単純なジェネレーターを使用します。

template <typename T>
struct gen {
    T x;
    gen(T seed) : x(seed) { }

    T operator ()() { return x++; }
};

generate(a.begin(), a.end(), gen<int>(0));
于 2008-10-16T11:13:18.090 に答える
4

SGI STL (または STLPort などの派生物) を使用している場合は、iota. :-)

void IndexArray(unsigned int length, vector<unsigned int>& v)
{
    vector<unsigned int>(length).swap(v);
    iota(v.begin(), v.end(), 0);
}
于 2008-10-16T08:39:03.940 に答える
2

adobe.ASL(およびvalue_iteratoriota()も)には関数もあります。ブーストにはcounting_iteratorがあり、ブーストでその場で数値シーケンスを生成する他のいくつかの方法があると思います。

于 2008-10-16T12:00:09.243 に答える
1

私はこれがすでに答えられていることを知っていますが、アルゴリズムライブラリの「塗りつぶし」機能を好みます。

// fill algorithm example
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main () {
  vector<int> myvector (8);                       // myvector: 0 0 0 0 0 0 0 0

  fill (myvector.begin(),myvector.begin()+4,5);   // myvector: 5 5 5 5 0 0 0 0
  fill (myvector.begin()+3,myvector.end()-2,8);   // myvector: 5 5 5 8 8 8 0 0

  cout << "myvector contains:";
  for (vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
    cout << " " << *it;

  cout << endl;

  return 0;
}

これもcplusplusreferenceから恥知らずに持ち上げられました。

于 2011-04-04T15:22:28.167 に答える
0

C スタイルの配列がある場合は、std:copy を使用できます。

int c_array[] = {3,4,5};

const int* pbegin = &c_array[0];
const size_t c_array_size = sizeof(c_array) / sizeof(c_array[0]);
const int* pend  = pbegin + c_array_size;

std::vector<int> v;
v.reserve(c_array_size);
std::copy(pbegin, pend, std:back_inserter(v));
于 2008-10-16T17:01:21.273 に答える