C++ 我想从运算符opverload函数中的向量中删除一个元素

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

我想在运算符重载函数中从向量中删除一个元素,我尝试使用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<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;
    }
}