2009-03-12 22 views
5

Tôi muốn lấp đầy các thùng chứa này khá nhanh chóng với một số dữ liệu để thử nghiệm. Cách tốt nhất và nhanh nhất để làm điều đó là gì? Nó không nên quá phức tạp, và do đó và cách phi nhân ngắn, nhưng cũng không là VerboseCách nhanh chóng điền vào vectơ, bản đồ và thiết lập, sử dụng các chức năng stl

Sửa

Guys Tôi nghĩ bạn có thể làm điều gì đó với memset knowning vector có một mảng gạch chân? Ngoài ra, còn bản đồ thì sao?

Trả lời

3

Nếu bạn đã có dữ liệu ban đầu được đặt xung quanh, nói trong một mảng kiểu C, đừng quên rằng các thùng chứa STL này có "các hàm tạo 2 vòng lặp".

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

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

Sửa: Tôi đã được yêu cầu hiển thị một ví dụ cho một bản đồ. Nó không phải là thường bạn có một loạt các cặp nằm xung quanh, nhưng trong quá khứ tôi đã tạo ra một kịch bản Python mà tạo ra các mảng của cặp từ một tập tin dữ liệu thô. sau đó tôi #include cấu trúc mã tạo này và initalized một bản đồ với nó như thế này:

#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); 

Hoặc nếu bạn có một loạt các phím, và và mảng các giá trị dữ liệu, bạn có thể lặp qua chúng, gọi đồ. chèn (make_pair (khóa, giá trị));

Bạn cũng hỏi về memset và vector. Tôi không nghĩ rằng có bất kỳ công đức thực để sử dụng memset để khởi tạo một vector, vì vectơ có thể được đưa ra một giá trị ban đầu cho tất cả các yếu tố của họ thông qua các nhà xây dựng:

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

bây giờ, còn bản đồ thì sao? –

+0

Đã thêm ví dụ cho bản đồ. –

5

Bạn có thể sử dụng std::fill hoặc std::generate.

+0

ví dụ xin vui lòng ... :) –

+0

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

12
  • tăng thư viện phân cách (http://www.boost.org/doc/libs/1_38_0/libs/assign/doc/index.html)

    sử dụng tăng namespace :: gán;
    std :: vector < int> v;
    v + = 1,2,3,4,5,6,7,8,9;

    std :: bản đồ < std :: string, int> m;
    chèn (m) ("Bar", 1) ("Foo", 2);

    vector < int> v;
    v + = 1, 2, repeat_fun (4, & rand), 4;

  • std :: tạo hoặc std :: generate_n

  • std :: backinserter - đôi khi sẽ giúp bạn
1

tôi sử dụng các nhà khai thác tùy chỉnh cho chèn dữ liệu:

#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, một vòng lặp đơn giản sẽ làm một công việc ngắn gọn hơn :) –

Các vấn đề liên quan