std::fill( ForwardIt first, ForwardIt last, const T& value )
允许我用常量值填充向量的一部分。
std::assign( InputIt first, InputIt last )
允许我完全用另一个向量的一部分替换向量。
STL中是否有一个结合了这两个函数的函数(像part_assign(begin, end, begin, end)
这样的smt)允许我用另一个向量填充向量的间隔?
如果没有,那么最有效的方法是什么?
答案 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
插入新数据。
为了(可能)提高效率,您首先要找到两者中较短的一件(旧件或新件)。然后,您将通过旧数据从新数据中复制该长度的数据。然后,如果新的大于旧的,则插入新数据的其余部分。否则(新的小于旧的)你将删除剩余的旧数据。