Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.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++ 进一步拆分向量中某些元素的最佳方法_C++_Vector - Fatal编程技术网

C++ 进一步拆分向量中某些元素的最佳方法

C++ 进一步拆分向量中某些元素的最佳方法,c++,vector,C++,Vector,这是一个样本向量 vector<string> v; v.push_back("one"); v.push_back("two"); v.push_back("three four"); v.push_back("five"); 我需要拆分元素编号3,因此现在向量看起来(不创建另一个向量) //印刷品 one two three four five one two three four five 我应该使用迭代器还是简单循环?它也应该有很好的性能。正如评论中指出的,如果您插入

这是一个样本向量

vector<string> v;
v.push_back("one");
v.push_back("two");
v.push_back("three four");
v.push_back("five");
我需要拆分元素编号3,因此现在向量看起来(不创建另一个向量)

//印刷品

one
two
three four
five
one
two
three
four
five

我应该使用迭代器还是简单循环?它也应该有很好的性能。

正如评论中指出的,如果您插入 元素进入向量(你将是),你必须避免 使用无效迭代器。尽管如此,还是有些类似的东西 以下各项中的任何一项都应起作用:

std::vector<std::string> iter = v.begin();
while ( iter != v.end() ) {
    std::string::iterator breakpoint = std::find( iter->begin(), iter->end(), ' ' );
    if ( breakpoint == iter->end() ) {
        ++ iter;
    } else {
        std::string next( breakpoint + 1, iter->end() );
        iter->erase( breakpoint, iter->end() );
        iter = v.insert( iter + 1, next );
    }
}
std::vector iter=v.begin();
while(iter!=v.end()){
std::string::iterator breakpoint=std::find(iter->begin(),iter->end(),“”);
如果(断点==iter->end()){
++iter;
}否则{
std::stringnext(断点+1,iter->end());
iter->erase(断点,iter->end());
iter=v.insert(iter+1,下一步);
}
}
在这种情况下,我通常更喜欢生成副本,
但是。

对于这个问题,std::list可能是一个更好的数据结构(性能更好)。或者您无法避免std::vector?为什么不使用迭代器进行简单循环?也可以读到。但就像Ante所说的,在容器的中间插入不是最好的,就更好了。你需要问自己的问题是:这会是常见的吗?@ TeReMeStR19对于删除案例,考虑查看插入和朋友,一般地说,我的一般方法是1。找到要拆分的元素的位置。2.分开。3.创建一个新向量,将元素从上复制到拆分位置。4.附加拆分的元素。5.将图元从拆分位置复制到端点。列表针对这样的插入进行了优化,但它将取决于容器的大小,因为小尺寸的向量很快就可以生成copied@JoachimPileborg
std::list
显然具有不使迭代器失效的优点;然而,根据他循环的方式,他可能需要额外的逻辑(或不需要)来避免重新访问元素。如果std::vector是必须的,这个解决方案是好的。但我仍然不明白为什么std::vector会比std::list好?在向量端点以外的位置插入元素会导致容器将位置之后的所有元素重新定位到它们的新位置?向量中的插入通常是O(n)运算,而在列表中是O(1)@Ante简单的答案是因为它是,除非向量非常大或对象的复制成本非常高。常量因素很重要:分配是昂贵的,
std::list
为每个元素分配;局部性很重要,
std::vector
使其所有数据保持相邻。我曾经有机会实际测量过几次,每一次,
std::vector
beat
std::list
,包括任意位置的插入和删除。是的,这适用于小对象,主要是因为现代系统中的缓存。但当你说std::vector中的插入比std::list快时,听起来很奇怪,人们可以得出这样的结论。没关系,正如您所说的,对于小型阵列和对象,它的速度更快,但通常当人们想要好的性能时,他们会问,因为他们有大规模问题(大数据规模)。关于这个主题的文章不错:@Ante缓存和分配/释放都起到了作用。不可能预先说哪个更快,而且在许多情况下,哪个更快会从一台机器切换到下一台机器。一般来说,我发现最好的解决方案是使用
std::vector
(假设您不需要迭代器的稳定性),如果性能出现问题,可以尝试其他方法。并且几乎忽略O(),O()是基于具有恒定时间的单个操作的,而今天的情况并非如此。@Ante如果向量的后续访问时间比列表更好,那么在整体性能改进策略中,使用向量可能是首选。