0

myList在下面的代码中,它仅在第一次调用时附加appendMyList(),并且 size 保持为 1,所以有人可以解释这里出了什么问题:

struct MyKey {
  int accValue;
  std::string name;
};

inline bool operator<(MyKey a, MyKey b){
  return a.accValue < b.accValue && a.name < b.name;
}

inline bool operator==(MyKey a, MyKey b){
  return a.accValue == b.accValue && a.name == b.name;
}

typedef std::map<MyKey, std::vector<int>> MyList;

class MyClass {
    public:
    void appendMyList(int accVal, std::string name, int element) {
        myList[MyKey{accVal, name}].push_back(element);
        cout<<endl<<"Size after"<< myList.size()<<endl;
    }

   MyList myList;
};

我在这里看到了类似的帖子,但我的运营商没有发现任何问题,所以我猜是别的原因?

这就是我调用函数的方式:

int main()
{
    MyClass imHere;
    int a = 1;
    std::string yaya = "name";
    for (int i = 0; i<10; i++) {
            imHere.appendMyList((++a), yaya, i);
    }

    return 0;
};
4

1 回答 1

0

std::map不允许存储重复项。但是,它不operator==用于检查元素的相等性。它既operator<用于排序元素,也用于检查等价性

也就是说,如果!(a < b) && !(b < a)thenstd::map考虑ab等价,因此使用 your 插入的元素不会超过一个operator<,因为name在所有元素中都是相同的,因此两者都是(a < b)(b < a)return false

相反,您应该使用:

inline bool operator<(MyKey a, MyKey b) {
  return a.accValue < b.accValue || (a.accValue == b.accValue && a.name < b.name);
}

或者:

inline bool operator<(MyKey a, MyKey b) {
  return std::tie(a.accValue, a.name) < std::tie(b.accValue, b.name);
}
于 2020-06-05T17:02:48.530 回答