C++ 我想从运算符opverload函数中的向量中删除一个元素
我想在运算符重载函数中从向量中删除一个元素,我尝试使用vector.erease,但出现了一个错误 这是Dict类标题:C++ 我想从运算符opverload函数中的向量中删除一个元素,c++,class,operator-overloading,C++,Class,Operator Overloading,我想在运算符重载函数中从向量中删除一个元素,我尝试使用vector.erease,但出现了一个错误 这是Dict类标题: #include <iostream> #include <vector> #include "Node.h" using namespace std; template <class K, class V> class Dict { protected: vector<K> keys; vector<N
#include <iostream>
#include <vector>
#include "Node.h"
using namespace std;
template <class K, class V>
class Dict {
protected:
vector<K> keys;
vector<Node<V>> values;
public:
Dict();
V& operator[](const K &str);
};
这并不难,这里有一个基于迭代器的解决方案
auto i = keys.begin();
auto j = values.begin();
while (i != keys.end()) {
if (j->value == 0) {
i = keys.erase(i);
j = values.erase(j);
}
else {
++i;
++j;
}
}
但是正如已经指出的,如果你添加一个值为零的节点,你将删除你刚刚添加的节点,你的程序将失败。我想答案是在这个循环之后而不是之前添加新的键和值。@Qubit总是有理由使用所有东西,因此它们为什么会存在,但是Yoav Linder说它们是一个学习者,所以我想在对话中谨慎。这是我在开始时非常感激的事情。如果您的节点将值初始化为0,那么对操作符的第一次调用失败。然后它被推入向量,并被第二个for循环删除。然后返回values.back,这是无效的,因为值为空运算符[]中的第二个for循环非常奇怪。它的目的是什么?如果我不知道它试图做什么,我就无法修复它。要清楚,这里的许多问题之一是,您添加了一个默认构造的节点,该节点的值为零,然后尝试删除它,然后返回对空向量最后一个元素的引用。这不是唯一的问题。在调试器中单步执行它,看看会发生什么。无论是否使用字典,最后一个for循环在概念上都不正确。如果删除项目,则不应增加i索引。您应该通过创建while循环或类似循环来完全控制i,而不是让i使用for自动递增。进程结束时,退出代码139被信号11:SIGSEGVStep中断,在调试器中通过它。@YoavLinder所以您的代码中的其他地方有一个bug。从长远来看,最好学会自己调试。
#include <iostream>
#include <vector>
using namespace std;
template <class V>
class Node {
protected:
Node& operator=(const V& val);
public:
V value;
};
#include "Node.h"
template <typename V>
Node<V>& Node<V>::operator=(const V &dict) {
this->value = dict;
return *this;
}
int main() {
Dict<string, int> d1;
Dict<string,double> d2;
d1["a"] = 5;
d1["b"];
d1.print();
return 0;
}
*** Error in `/home/giftsky/CLionProjects/Dictionary/cmake-build-debug/Dictionary': double free or corruption (out):
auto i = keys.begin();
auto j = values.begin();
while (i != keys.end()) {
if (j->value == 0) {
i = keys.erase(i);
j = values.erase(j);
}
else {
++i;
++j;
}
}