gpt4 book ai didi

c++ - 用于排序 map 元素的 map 比较器

转载 作者:太空宇宙 更新时间:2023-11-04 15:55:26 24 4
gpt4 key购买 nike

我希望 map 的元素按特定顺序排列(最短的在前)。所以我写了一个简单的比较器,它将插入到 map 中的元素的长度与之前的元素进行比较。

struct cmpByStringLength {
bool operator()(const std::string& a, const std::string& b) const {
return a.length() < b.length();
}
};

int main()
{
map<string,string,cmpByStringLength> obj1;
obj1.insert(make_pair("Anurag","Last"));
obj1.insert(make_pair("Second","Last"));

for(map<string,string>::iterator it=obj1.begin();it!= obj1.end();++it)
{
cout<<it->first;
cout<<endl;
}
return 0;
}

但是上面不会在映射中插入键为 Second 的元素,因为比较器将键为 Second 的元素与 Anurag 进行比较,并且它们的长度相等,因此不会插入带有键 Second 的元素。但是,以下内容可以正常工作:

    obj1.insert(make_pair("abc","Last"));
obj1.insert(make_pair("abcdefg","Last"));
obj1.insert(make_pair("abcd","Last"));

事实证明,我对自定义比较器对映射中的元素进行排序的理解是错误的,因为它用于插入元素,而不是根据我通过比较器提供的排序逻辑插入元素。

所以换句话说,自定义比较器只是用来决定是否在 map 中插入一个元素,而不是用来决定在哪里放置元素?

最佳答案

关于 map 的 C++ 文档(以及任何使用 std::less 风格比较器的东西)非常清楚地表明两个元素 a , b 等价于当且仅当 !comp(a, b) && !comp(b, a) (参见,例如 https://en.cppreference.com/w/cpp/container/map )。这意味着,是的,您的比较器用于订购等价性测试。

通常解决此问题的方法是实现两级比较,例如

return (a.length() == b.length()) ? (a < b) : (a.length() < b.length());

关于c++ - 用于排序 map 元素的 map 比较器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59043126/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com