2009-03-12 2 views
5

테스트를 위해 일부 데이터로 컨테이너를 빠르게 채우고 싶습니다. 무엇을 할 수있는 최선의 빠른 방법은 무엇입니까? 너무 복잡한, 따라서 및 비인간적 짧은 안뿐만 아니라 당신이 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에 대해서도 문의하십시오.

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 : 나는 벡터가 생성자를 통해 모든 요소에 대한 초기 값을 제공 할 수 있기 때문에 벡터를 초기화 memset 함수를 사용하는 실제 장점이 있다고 생각하지 않습니다 //msdn.microsoft.com/en-us/library/kaxe2wy9.aspx http://msdn.microsoft.com/en-us/library/46h7chx6.aspx – Paul

12
  • 부스트 할당 라이브러리 방식 네임 스페이스 부스트를 사용하여 (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;

  • 표준 : 생성하거나 표준 : generate_n는

  • 표준 : 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

아아, 간단한 for 루프는보다 간결한 작업을 수행합니다. :) –