Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有没有更快的方法在std::vector中插入元素_C++_Performance_Vector_Insert - Fatal编程技术网

C++ 有没有更快的方法在std::vector中插入元素

C++ 有没有更快的方法在std::vector中插入元素,c++,performance,vector,insert,C++,Performance,Vector,Insert,我正在尝试在以下向量中插入字符串:std::vector fileVec 在调用这些行之前,fileVec中已经有很多元素(最多100万个字符串): int index = 5; //there is some code here to find the index i want insert the text (let's take for example has value 5) fileVec.insert(fileVec.begin() + index, "add this text

我正在尝试在以下向量中插入字符串:
std::vector fileVec

在调用这些行之前,
fileVec
中已经有很多元素(最多100万个字符串):

int index = 5;

//there is some code here to find the index i want insert the text (let's take for example has value 5)

fileVec.insert(fileVec.begin() + index, "add this text");
我的问题是插入文本要花很多时间(特别是如果索引是一个小数字)

有没有更快的方法在大向量中添加元素(而不删除其他元素)


>代码> FILVEC。INSERT <代码>不会被多次调用,大约15次。

<代码> STD::向量不是设计用于在中间添加元素,特别是如果它非常大(一百万个元素是巨大的)。考虑使用<代码> STD::list < /Cord>——一个双链表,其中添加元素在中间非常快,因为你所要做的就是改变一些指针。在

std::vector
中,必须移动所有元素,这当然会导致大量开销

但同时,访问
std::list
中的单个元素的速度很慢,因为您需要遍历整个列表,直到找到所需的元素


因此,选择你的毒药,但我强烈建议在这种情况下使用
std::list

我假设你的向量已排序(否则你可以在末尾添加新字符串)


你用这个向量做什么?搜索?在这种情况下,您可以将这15个新字符串保留在另一个向量中,首先在该向量中搜索,如果未找到,则在原始向量中搜索。

在向量的开头或中间插入永远不会很快
std::vector
不是为这样使用而设计的。如果您需要经常这样做,那么您应该寻找不同的数据结构,例如
std::list
。使用
std::vector
有什么特殊原因吗?你还有其他要求吗?您还如何使用此
fileVec
?为什么需要在特定位置插入,例如,为什么特别需要有序向量?“在std::vector中插入元素的快速方法”-可能-向量不是您需要的。有一些选项。“std::list速度很慢,因为您需要遍历整个列表,直到找到所需的列表。”我不能使用指针立即访问所需索引处的元素?是的,您可以使用指针快速访问元素,但需要小心。根据容器的不同,使引用无效的任何操作也将使指针无效
std::list
可能可以,但是
std::vector
肯定不行。字符串是否相当大?n个插入是否在一个步骤中执行?对一个元素有很多随机访问吗?一般来说,最佳解决方案取决于用例不仅是访问特定的
列表
元素的速度慢,而且顺序遍历元素的速度也会慢,因为
列表
存储在内存中是非本地的。因此,到达字符串内容的一个缓存未命中可以变成两个缓存未命中,以首先访问元素,然后到达字符串。如果集合足够大,常见情况下的性能降低可能高达50%。所以,是的,选择你的毒药,但这取决于最常见的情况,例如向量被遍历的频率。