将矢量部分分配给另一个

时间:2017-02-15 22:15:52

标签: c++ vector stl

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

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

STL中是否有一个结合了这两个函数的函数(像part_assign(begin, end, begin, end)这样的smt)允许我用另一个向量填充向量的间隔?

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

3 个答案:

答案 0 :(得分:8)

是的,它被称为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移动迭代器。

答案 1 :(得分:1)

类模板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 

答案 2 :(得分: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插入新数据。

为了(可能)提高效率,您首先要找到两者中较短的一件(旧件或新件)。然后,您将通过旧数据从新数据中复制该长度的数据。然后,如果新的大于旧的,则插入新数据的其余部分。否则(新的小于旧的)你将删除剩余的旧数据。