使用std::vector::Assign()将矢量的一部分分配给它自己
Assign part of a vector to itself using std::vector::assign()
假设我有一个大小为10的向量(v1)。现在我只想保留部分元素,使用:v1.assign(v1.begin() + 2, v1.begin() + 6);
我不确定的是,原始元素是否会在分配之前被销毁。如果他们首先被摧毁,那么我就不能依赖原始数据。
此页面似乎表示元素首先被擦除。然而,一个快速的实验告诉我数据被正确地分配给了它自己。
那么,当将向量的一部分分配给它自己时,会发生什么呢?
根据C++14标准表100——序列容器要求(除了集装箱)
表达式a.assign(i,j)
有一个前提条件,即i
和j
不是a的迭代器
v1.assign(v1.begin() + 2, v1.begin() + 6);
使用迭代器作为v1
的迭代器,因此您违反了条件
如果你想重置向量以包含子范围,那么你可以将这些元素复制到一个临时向量中,然后将该临时向量分配回主向量。这应该是一个移动操作(C++11及以上版本),因此不需要进行额外的复制。
v = std::vector<decltype(v)::value_type>(v.begin() + 2, v.begin() + 6);
正如Benjamin Lindley和Barry在评论中指出的那样,我们可以使用std::copy
并移动像这样的迭代器
std::copy(std::make_move_iterator(v.begin() + 2), std::make_move_iterator(v.begin() + 6),
std::make_move_iterator(v.begin()));
来自C++11标准:
23.3.6.2矢量构造函数、复制和赋值
template <class InputIterator> void assign(InputIterator first, InputIterator last);
11效果:
erase(begin(), end()); insert(begin(), first, last);
换句话说,不要使用:
v1.assign(v1.begin() + 2, v1.begin() + 6);
当调用insert
时,first
将是一个无效的迭代器。
相关文章:
- 这个C++编译器优化(在自身的实例上调用对象自己的构造函数)的名称是什么,它是如何工作的?
- C++链表节点是指它自己
- 如何在c++中对向量进行切片并分配给它自己
- C++ std::函数,返回它自己的类型(再次递归类型)
- 它自己类的c++类常量
- 一个对象在析构函数中获取互斥以防止删除它自己
- 使用std::vector::Assign()将矢量的一部分分配给它自己
- 是否可以将项目直接从Visual Studio导出到它自己的文件夹中?
- C++:一个类可以有它自己的类型的对象吗?
- 一个类是如何从一个专门针对它自己的模板派生出来的
- 为什么派生类调用基类运算符而不是它自己的运算符
- 是否有任何已知的技术可以使用将 DLL 插件分离到它自己的进程中?
- 当我读取文件时,由于某种原因,它自己改变了文件中的位置
- 如何在它自己的类中声明一个对象数组?
- 如何在C++中将字符串中的元素转换为它自己的字符串?
- 将一个c++对象传递给它自己的构造函数是否合法
- 在它自己的源文件中包含头文件
- 循环问题:从它自己的成员函数中访问一组对象
- 使用 on_<widget>_<signal> 其中小部件它自己的类
- 返回的结构调用它自己的析构函数,用于销毁分配的对象