2009-03-12 3 views
5

これらのコンテナにはテストのためのデータをかなり素早く書きたいと思っています。それを行うための最良かつ迅速な方法は何ですか?それはあまりにも複雑なため、とinhumanly短くすべきではないが、また、私はあなたがmemsetのは下線アレイを有するそのベクトルをknowningで何かを行うことができます思っstl関数を使用してベクトル、マップ、およびセットを素早く埋める

編集

男を冗長にしませんか? また地図についてはどうですか?

答えて

3

あなたの場合すでにCスタイルの配列のように、初期データを配置している場合は、これらのSTLコンテナに「2イテレータコンストラクタ」があることを忘れないでください。

const char raw_data[100] = { ... }; 

std::vector<char> v(raw_data, raw_data + 100); 

編集:私は、マップの一例を示すように頼まれました。ペアの配列が並んでいることはよくありませんが、過去には、生データファイルからペアの配列を生成するPythonスクリプトを作成しました。マップを呼び出して、あなたがそれらをループすることができ、あなたはキーの配列を持っている場合、代わりに

#include <map> 
#include <string> 
#include <utility> 

using namespace std; 

typedef map<string, int> MyMap; 

// this array may have been generated from a script, for example: 
const MyMap::value_type raw_data[2] = { 
    MyMap::value_type("hello", 42), 
    MyMap::value_type("world", 88), 
}; 

MyMap my_map(raw_data, raw_data + 2); 

、およびデータ値の配列:私は、このコードが生成した構造を#includeし、このようなことでマップをinitalized。挿入(make_pair(key、value));

memsetとvectorについてもお尋ねします。 Iベクトルはコンストラクタを介してすべての要素の初期値を与えることができるため、ベクトルを初期化するためにmemsetを使用する任意の真のメリットがあるとは思わない:

vector<int> v2(100, 42); // 100 ints all with the value of 42 
vector<string> v(42, "initial value"); // 42 copies of "initial value" 
+0

今、地図はどうですか? –

+0

マップの例を追加しました。 –

5

std::fillまたはstd::generateを使用できます。

+0

例ください... :) –

+0

ます。http: //msdn.microsoft.com/en-us/library/kaxe2wy9.aspx http://msdn.microsoft.com/en-us/library/46h7chx6.aspx – Paul

12
  • 名前空間boostを使用してブースト割り当てライブラリ道(http://www.boost.org/doc/libs/1_38_0/libs/assign/doc/index.html

    は::割り当てます。
    std :: vector < int> v;
    v + = 1,2,3,4,5,6,7,8,9;

    std :: map < std :: string、int> m; insert(m)( "Bar"、1)( "Foo"、2);

    ベクトル< int> v;
    v + = 1,2、repeat_fun(4,&ランド)、4;

  • のstd ::生成するかのstd :: generate_n

  • のstd :: backinserter - 時々私はデータを挿入するためのカスタム演算子を使用して、あなたに
1

を助ける:

#include <vector> 
#include <iostream> 
#include <string> 

using namespace std; 

template <class T> 
vector<T>& operator<<(vector<T>& vec, const T& x) { 
    vec.push_back(x); 
    return vec; 
} 

vector<string>& operator<<(vector<string>& vec, char* cstr) { 
    string s(cstr); 
    vec.push_back(s); 
    return vec; 
} 

int main() { 
    vector<int> foo; 
    vector<string> bar; 
    foo << 7 << 8 << 9 << 10; 
    bar << "foo" << "bar" << "baz"; 
} 
+0

argh、単純なforループは、より簡潔な仕事を行います:) –

関連する問題