Быстрый способ заполнить вектор, карту и установить, используя функции stl - PullRequest
5 голосов
/ 13 марта 2009

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

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

Ребята, я думал, вы можете что-то сделать с memset, зная, что вектор имеет массив подчеркивания? А как насчет карты?

Ответы [ 4 ]

12 голосов
/ 13 марта 2009
  • способ расширенного назначения библиотеки (http://www.boost.org/doc/libs/1_38_0/libs/assign/doc/index.html)

    с использованием увеличения пространства имен :: assign;
    std :: vector v;
    v + = 1,2,3,4,5,6,7,8,9;

    std :: map m;
    insert (m) («Бар», 1) («Фу», 2);

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

  • std :: generate или std :: generate_n

  • std :: backinserter - иногда вам поможет
5 голосов
/ 13 марта 2009

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

3 голосов
/ 13 марта 2009

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

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

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

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

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

В качестве альтернативы, если у вас есть массив ключей и массив значений данных, вы можете зациклить их, вызывая map.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"
1 голос
/ 13 марта 2009

Я использую пользовательские операторы для вставки данных:

#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";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...