附加使用 Struct 作为"multikey"并将 std::vector 用作映射值的映射
Appending map that uses Struct as a "multikey" and std::vector as mapped value
下面的代码中,它仅在第一次调用appendMyList()
时附加myList
,并且大小保持为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;
};
std::map
不允许存储重复项。但是,它不使用operator==
来检查元素的相等性。它对两者都使用operator<
- 对元素进行排序以及检查等价性。
也就是说,如果!(a < b) && !(b < a)
那么std::map
认为a
和b
等价的,因此使用您的operator<
插入的元素不超过一个,因为name
在所有元素中都是相同的,因此(a < b)
和(b < a)
都返回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);
}
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- <char> 使用 Vulkan 映射内存时如何使用 std::vector 而不是 void**?
- 附加使用 Struct 作为"multikey"并将 std::vector 用作映射值的映射
- 如何在 JniWrapper 中将 Java ArrayList<float[]> 映射到C++ Vector<array<float,size>>?
- 当请求的键丢失时,有没有办法从向量映射返回 std::vector ref?
- 如何将 Eigen::Matrix 映射到 std::vector<Eigen::vector>?
- 有一个具有映射到 std::vector 属性的 Eigen::matrix 属性的类
- 一行 std::vector ctor 来自映射另一个向量
- C++类似于 std::vector / boost::array 的文件内存映射容器
- 使用 std::vector 将C++结构映射到 C#
- 如何拥有:map<T,vector<迭代器来映射自身> >?
- 编译器不推导模板参数(映射std::vector->std::vector)
- 将stxxl::vector映射到带有头文件
- 如何使用 swig 类型映射将 std::vector<std::p air<std::string, int> > 从 java 返回到 c++
- 从映射文件中读取带有vector的结构体
- 包含 std::string 和 std::vector <Another_Struct>的映射
- 反转映射<字符串、int> 到 vector<vector >的映射<string>
- 在(c++) cocos2dx中添加映射对象到Vector
- std::映射<>或std::vector<>在处理大型标志集时
- 创建 boost::tuple<std::string、std::string、int> 和 std::vector <int>的映射