Предварительно выделить память для вектора строк (C ++ vector <string>) - PullRequest
2 голосов
/ 04 апреля 2011

В C ++ существует ли умный (то есть быстрый) способ предварительно выделить память для вектора строк, чтобы каждый элемент имел некоторый минимальный размер? Наивный способ, который я имею, состоит в следующем:

vector<string> my_string_vector;
my_string_vector.resize(1000);
for (unsigned int ui=0; ui<1000; ui++)
   my_string_vector[ui].reserve(1024);

Большое спасибо заранее,

Адам

Ответы [ 3 ]

3 голосов
/ 05 апреля 2011

Нет быстрого способа сделать это.Вы можете получить меньше строк кода, но вы все равно будете делать один вызов reserve для каждого std::string в std::vector.

Я считаю, EASTL или Boost.Pool может помочь, если вы готовы пойти по этому пути.

1 голос
/ 04 апреля 2011

Единственный способ предварительно выделить всю эту память сразу - реализовать собственные распределители, например, так (код не завершен, поскольку очевидно, что распределители имеют больше членов, которые необходимо поддерживать):

class my_string_allocator {
public:
   char * allocate(size_type n, allocator<void>::const_pointer hint=0) {
      // ... grab a chunk from your pre-allocated pool ...
   }
};

typedef basic_string<char, char_traits<char>, my_string_allocator> my_string;

class my_vector_allocator {
public:
   my_string * allocate(size_type n, allocator<void>::const_pointer hint=0) {
      // ... similar magic goes here ...
   }
}

vector<my_string, my_vector_allocator> my_string_vector(1000);
for (unsigned int ui=0; ui<1000; ui++)
   my_string_vector[ui].reserve(1024);  // Memory taken from pool; no allocation.

Это действительно только практично, если вы точно знаете, что выделяете на время жизни этих структур данных, поскольку более гибкое распределение потребует логики, подобной управлению кучей, в ваших распределителях.

1 голос
/ 04 апреля 2011

Это создаст одну строку с емкостью не менее 1024, а затем скопируйте ее 1000 раз в вектор.

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

int main() {
   std::string s;
   s.reserve(1024);
   std::vector<std::string> my_string_vector(1000, s);
   std::cout << my_string_vector[42].capacity() << "\n";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...