哪个数据结构更适合std字符串数组

时间:2016-11-02 06:02:35

标签: c++ string data-structures queue

我需要一个如下结构:

Figure1

结构必须保持固定大小std::string s,以使其元素数为finit(100 - 10000000)。

我希望能够随机访问每个元素,如下所示:

std::string Temp = MyStrcuture[i];

MyStrcuture[i] = std::string Temp;

我必须选择没有(可能)内存泄漏的最快结构。

哪一个对我更好?

  1. std::string* MyStrcuture = new std::string[Nu_of_Elements];
  2. std::queue< std:string> MyStrcuture(Nu_of_Elements);
  3. std::vector< std:string> MyStrcuture(Nu_of_Elements);
  4. boost::circular_buffer< std::string> MyStrcuture(Nu_of_Elements);
  5. 你的建议?

3 个答案:

答案 0 :(得分:13)

std::vector< std:string> MyStrcuture(Nu_of_Elements);

Vector最适合您的要求。它支持基于索引的元素访问,因为元素存储在连续的内存地址中,并且具有大小的灵活性。

  1. std:string * MyStrcuture = new std :: string [Nu_of_Elements];

    C++ STL vector vs array in the real world

  2. 的std ::队列&LT; STD:字符串&GT; MyStrcuture(Nu_of_Elements);

    How do I get the nth item in a queue in java?
    不支持基于索引的元素访问。

  3. 的std ::矢量&lt; STD:字符串&GT; MyStrcuture(Nu_of_Elements);的

    Clean-up:向量的析构函数会自动调用向量中每个元素的析构函数。

  4. 升压:: circular_buffer&LT;的std :: string&GT; MyStrcuture(Nu_of_Elements);

    与第二个原因相同。 Know more

答案 1 :(得分:4)

好吧,因为你的字符串有固定的大小,如果你在处理字符串时没有专门的要求,并且有足够的空闲内存用于连续分配。你可以使用std :: array&lt; char,400&gt;或std :: unique_ptr&lt; char *&gt;而不是std :: string。

  1. 您必须以C方式管理内存。考虑智能指针
  2. std :: queue没有随机访问权限,Access c++ queue elements like an array

  3. 如果要更改字符串数,
  4. std :: vector是合适的。但是,clear()函数只调用元素的析构函数,而不是自由向量分配的内存(可以在清除后检查容量)。

  5. 阅读boost documentation后。如果您的字符串数量有一个上限(您说的是10百万),则随机访问循环缓冲区是合适的。但实际上你有这么少的字符串就浪费了记忆。所以我建议使用智能指针。

  6. 如果您的字符串数量从一开始就是固定不变的。您可以查看C++11 array container

答案 2 :(得分:0)

如果元素和长度的数量是固定的并且内存是关键的,您可以考虑使用plain char数组,它提供最小的内存开销和快速可访问性。您的代码将如下所示:

char* MyStructure = new char[n * 401];
memset(MyStructure, 0, n * 401);

std::string Temp = MyStructure[i * 401]; // Get value
strcpy(MyStructure[i * 401], Temp.c_str()); // Put value

401这里是400字节的字符串和1尾随零。