将向量的一部分赋值给另一个向量

3
std::fill(ForwardIt first, ForwardIt last, const T& value)允许我使用一个常量值填充vector的一部分。

std::assign(InputIt first, InputIt last)允许我用另一个向量的一部分完全替换一个vector

STL中是否有一种将这两个函数结合起来的方法(类似于part_assign(begin, end, begin, end)),可以用另一个向量填充向量的间隔?

如果没有,最有效的方法是什么?


你从哪里得到这个 std::assign 的? - Jonathan Wakely
@JonathanWakely 他可能在考虑使用 std::vector::assign() - Remy Lebeau
3个回答

9
是的,它被称为std::copy:
std::copy(src_begin, src_end, dst_begin);

它会将来自源向量中std::distance(src_begin, src_end)个元素复制到以dst_begin为起始位置的目标向量元素中。与fill一样,如果要改变接收容器的话,目标迭代器可以是插入迭代器。

还有其他几种变化,例如:

std::copy_n(src_begin, n, dst_begin);

这段代码复制了n个元素。同时,也有std::move函数,它是移动元素而不是复制它们,或者你可以使用移动迭代器和copy函数。


据我所见,copy函数会将元素插入向量中。我正在寻找的是一种函数,它可以从某个迭代器开始,用其他元素序列替换向量中的元素。 - Robert Hönig
@RobertHönig:是的,我明白了。您正在寻找std::copy - Kerrek SB
2
据我所见,copy将元素插入向量中。不是的。它对于每个i从0到std::distance(src_begin, src_end)执行赋值*(dst_begin+i) = *(src_begin+i)。这不会向向量中插入任何新元素,除非dst_begin是指向向量的back_insert_iterator。它只是为现有元素分配新值。 - Jonathan Wakely

2

在类模板std::vector中有三种这样的方法,它们是:

iterator insert(const_iterator position, size_type n, const T& x); 
template <class InputIterator> 
iterator insert(const_iterator position, InputIterator first, InputIterator last); 
iterator insert(const_iterator position, initializer_list<T> il); 

看起来对于你的任务来说,最合适的方法是

template <class InputIterator> 
iterator insert(const_iterator position, InputIterator first, InputIterator last); 

这是一个演示程序。
#include <iostream>
#include <vector>
#include <iterator>

int main() 
{
    std::vector<int> v1 = { 0, 1, 1, 0 };

    std::vector<int> v2 = { 1, 2, 3, 2, 1 };

    v1.insert( std::next( v1.begin(), 2 ), 
               std::next( v2.begin(), 1 ), 
               std::prev( v2.end(), 1 ) ); 

    for ( int x : v1 ) std::cout << x << ' ';
    std::cout << std::endl;
}   

程序的输出为:
0 1 2 3 2 1 0 

0

至少我理解这个问题的意思是,您正在寻找一种方式,其中(例如)可以有一个输入向量:

[1, 2, 3, 4, 5, 6]

我想用不同的数据替换 3, 4, 5 这部分内容——比如说 [7, 8, 9, 10, 11, 12],因此操作后,结果应该是:[1, 2, 7, 8, 9, 10, 11, 12, 6]。特别地,我假设旧的部分和新的部分不一定是相同长度的。

如果我的理解是正确的,那么答案是“否”。也就是说,std::vector 和标准算法都不直接支持这样做。

简单的方法是使用 vector::erase 删除原始数据,然后使用 vector::insert 插入新数据。

为了(可能)提高效率,您可以先找到两个数据中较短的一个(旧数据或新数据)。然后从新数据复制该长度的数据到旧数据中。接着,如果新数据比旧数据大,您可以插入剩余的新数据。否则(新数据比旧数据小),您可以清除旧数据的剩余部分。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接