我需要一个如下结构:
结构必须保持固定大小std::string
s,以使其元素数为finit
(100 - 10000000)。
我希望能够随机访问每个元素,如下所示:
std::string Temp = MyStrcuture[i];
或
MyStrcuture[i] = std::string Temp;
我必须选择没有(可能)内存泄漏的最快结构。
哪一个对我更好?
std::string* MyStrcuture = new std::string[Nu_of_Elements];
std::queue< std:string> MyStrcuture(Nu_of_Elements);
std::vector< std:string> MyStrcuture(Nu_of_Elements);
boost::circular_buffer< std::string> MyStrcuture(Nu_of_Elements);
答案 0 :(得分:13)
std::vector< std:string> MyStrcuture(Nu_of_Elements);
Vector最适合您的要求。它支持基于索引的元素访问,因为元素存储在连续的内存地址中,并且具有大小的灵活性。
std:string * MyStrcuture = new std :: string [Nu_of_Elements]; 否强>
的std ::队列&LT; STD:字符串&GT; MyStrcuture(Nu_of_Elements); 否强>
How do I get the nth item in a queue in java?
不支持基于索引的元素访问。
的std ::矢量&lt; STD:字符串&GT; MyStrcuture(Nu_of_Elements);的是
Clean-up:向量的析构函数会自动调用向量中每个元素的析构函数。
升压:: 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。
std :: queue没有随机访问权限,Access c++ queue elements like an array
std :: vector是合适的。但是,clear()函数只调用元素的析构函数,而不是自由向量分配的内存(可以在清除后检查容量)。
阅读boost documentation后。如果您的字符串数量有一个上限(您说的是10百万),则随机访问循环缓冲区是合适的。但实际上你有这么少的字符串就浪费了记忆。所以我建议使用智能指针。
如果您的字符串数量从一开始就是固定不变的。您可以查看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尾随零。