2009-03-12 1 views
5

Я хочу быстро заполнить эти контейнеры некоторыми данными для тестирования. Каковы наилучшие и быстрые способы сделать это? Оно не должно быть слишком запутанным, и, таким образом, и нечеловеческий коротким, но и не слишком разговорчивымБыстрый способ заполнить вектор, карту и установить с помощью функций stl

Редактировать

Ребят, я думал, что вы можете сделать что-то с MemSet Knowning, что вектор имеет подчеркивающий массив? Также, как насчет карты?

ответ

3

Если вы уже имеют начальные данные, скажем, в массиве стилей C, не забывайте, что эти контейнеры STL имеют «конструкторы 2-итератора».

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

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

Edit: Меня попросили показать пример карты. Не часто у вас имеется массив пар, но в прошлом я создал скрипт Python, который сгенерировал массив пар из файла необработанных данных. Затем я #include этого кода сгенерированной структуры и initalized карты с ним, как это:

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

В качестве альтернативы, если у вас есть массив ключей, а также и массив значений данных, вы можете цикл над ними, называя карту. insert (make_pair (ключ, значение));

Вы также спрашиваете о memset и vector. Я не думаю, что есть какая-то реальная заслуга использования 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

сейчас, как насчет карты? – 2009-03-13 13:09:55

+0

Добавлен пример для карты. –

5

Вы можете использовать std::fill или std::generate.

+0

примеров, пожалуйста ... :) – 2009-03-12 22:34:11

+0

HTTP: //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;
    вставка (м) («Бар», 1) («Foo», 2);

    vector < int> v;
    v + = 1, 2, repeat_fun (4, & rand), 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

argh, простой цикл будет выполнять более лаконичную работу :) – 2009-03-12 23:04:57

 Смежные вопросы

  • Нет связанных вопросов^_^