C++ 如何用向量中的另一个范围替换一个范围?

C++ 如何用向量中的另一个范围替换一个范围?,c++,vector,stl,C++,Vector,Stl,我想用单个其他元素替换向量中的一系列元素(从该范围构建,但这无关紧要)。我希望这样做时不要先擦除然后插入,因为所有后续元素都会移动两次 我想我们可以用另一个范围来代替一个范围,不管它们的大小。用某物替换一个空范围,您将获得insert。将某个内容替换为空范围,则会被擦除 无论如何,replace似乎不会这样做。它用给定元素的副本替换rage中的所有或部分元素。不准走动 swap_范围逐个交换元素,不进行擦除或插入 我是否错过了这方面的算法?也许是一个成员函数 也许我应该使用列表 我想用单个其他元

我想用单个其他元素替换向量中的一系列元素(从该范围构建,但这无关紧要)。我希望这样做时不要先擦除然后插入,因为所有后续元素都会移动两次

我想我们可以用另一个范围来代替一个范围,不管它们的大小。用某物替换一个空范围,您将获得insert。将某个内容替换为空范围,则会被擦除

无论如何,
replace
似乎不会这样做。它用给定元素的副本替换rage中的所有或部分元素。不准走动

swap_范围
逐个交换元素,不进行擦除或插入

我是否错过了这方面的
算法
?也许是一个成员函数

也许我应该使用
列表

我想用单个其他元素替换向量中的一系列元素

据我所知,在标准库中没有这方面的算法。但它可以相当简单地建立在现有的基础上:除去第一个范围之外的所有内容。分配未删除的元素。在空范围的特殊情况下,插入而不是赋值。将迭代器返回到已删除元素的开头(如果未删除任何内容,则返回迭代器结束),以便调用方可以删除它们

我想我们可以用另一个范围替换一个范围来概括这一点

这与单插入变体的工作原理几乎相同,但更复杂。将赋值替换为
std::copy
,并考虑到还有一种情况,即根据输入范围的长度分配(复制)和插入子范围


顺序分配、删除、插入都无关紧要。

这是一个“仅使用迭代器”无法完成的算法。 要更改基础序列的大小,您需要能够在基础容器上调用
insert
erase

所以,即使你可能想写一些东西,比如:

template <typename Iter1, typename Iter2>
void replaceRange (Iter1 s_first, Iter1 s_last, Iter2 d_first, Iter2 d_last);
模板
无效替换范围(Iter1 s_优先,Iter1 s_最后,Iter2 d_优先,Iter2 d_最后);

它永远不会工作(除了大小相同的情况)

我也不知道stl算法。它们的形式主要是
n->1
1->n
n->n
,而不是
n->m
(其中
n
是前面的元素数,
m
是后面的元素数)
n=m
。您是否尝试编写函数来实现您想要的功能?成功的努力可能会帮助您识别一些尚未发现的术语,并可能改进您的搜索工作。。。同时,你可以使用你的函数直到你能找到你想要的。在
算法中没有关于这个的东西,但是你自己写应该不难。如果新范围比旧范围短(与您的情况相同,旧范围为空的边缘情况除外),这将转换为
std::copy
,然后是
std::vector::erase
。如果新范围更大,则转换为
std::copy
,然后是
std::vector::insert
。听起来很简单。我不是100%确定你在问什么(也许输入和输出示例会有所帮助),但我的第一个想法是使用
std::transform
可以作为成员函数<代码>myVec.replace(it1,end1,it2,end2)