矢量中的擦除方法
Erase Method in Vector
我正在编写一些代码,其中有 2 个向量分别包含 4 个智能指针。我不小心将第一个向量中生成的迭代器应用于第二个向量中的擦除方法。然后程序崩溃。我了解到复制构造和移动构造涉及擦除方法。根据调试器,我发现 1) 一个 nullptr 和 2 个智能指针保留在第一个向量中。2) 4 个智能指针驻留在第二个向量中。3)程序在几次成功运行后开始崩溃。我的问题如下,
- 如何将 nullptr 附加到第一个向量?
- 为什么允许将迭代器应用于第二个向量?
- 为什么程序从一开始就没有崩溃?
顺便说一句,我的平台是Xcode 8.1。提前致谢
#include <memory>
#include <vector>
#include <iostream>
#include <string>
using namespace std;
class A{
public:
A(string name_) : name(name_) {cout << name << " constructionn";}
const string& get_name() const {return name;}
~A() {cout <<get_name() << " destructionn";}
A (const A& rhs) : name(rhs.name){cout << "A copy constructorn";}
A(A&& rhs) : name(""){
cout <<"A move constructorn";
swap(rhs);
}
void swap(A& rhs) noexcept {
std::swap(name, rhs.name);
}
private:
string name;
};
void foo();
int main(){
foo();
}
void foo(){
vector<shared_ptr<A>> vect1, vect2;
auto a1 = make_shared<A>("Mike");
auto a2 = make_shared<A>("Alice");
auto a3 = make_shared<A>("Peter");
auto a4 = make_shared<A>("Paul");
vect1.push_back(a1);
vect1.push_back(a2);
vect1.push_back(a3);
vect1.push_back(a4);
vect2.push_back(a4);
vect2.push_back(a1);
vect2.push_back(a2);
vect2.push_back(a3);
auto it = vect1.begin();
vect1.erase(it);
for (auto &c : vect1){
cout << c->get_name() << endl;
}
vect2.erase(it);
for (auto &c : vect2){
cout << c->get_name() << endl;
}
}
在VS2015中,它在线vect2.erase(it);
失败并显示消息;迭代器越界,确实如此。
正如您在问题中所述it
甚至不属于vect2
.
即使它在您的平台上工作,它也是未定义的行为。所以从那以后,任何事情都可能发生。
你不再在 c++ 标准中工作,你现在正在处理你的平台实现的任何方式(也许它使用指针作为迭代器,也许它使用偏移量;谁知道呢?)。
相关文章:
- 为什么擦除方法会影响结束方法
- C++:std::ofstream 方法 open() 在第二次迭代时擦除打开的 ifstream 文件
- 矢量擦除方法是否需要类才能具有 = 运算符?
- 键入擦除成员函数指针的"right"方法是什么?
- 编译错误 std::vector<std::shared_ptr<T>>迭代器和擦除方法
- 无法使用擦除方法删除矢量的最后一个元素
- 类型擦除和一种模板方法模式
- 矢量中的擦除方法
- 是否将std矢量重新分配到默认的构造函数向量是擦除的好方法
- 擦除范围从std :: vector删除向量的最佳方法
- 有没有一种方法可以防止在STL无序映射上插入或擦除
- 在没有c++11的情况下,擦除映射中最后插入的元素的正确方法是什么
- 矢量擦除方法失败
- 使用擦除方法重置循环内的迭代器
- std::列表弹出和擦除方法无法销毁已删除的项目
- C++类型擦除,请使用 std::function 捕获单个类的多个方法
- 在维护顺序的同时从std::vector中删除/擦除重复元素的方法
- 实现任意类型擦除的小缓冲区优化的简单方法(如std::function.)
- 在遍历集合时从集合中擦除的最有效方法
- 如何实现擦除方法