为什么C++ set容器使用char*作为key时无法正确排序字符串元素
问题原因分析
你定义的是std::set<char*>容器,它的默认排序规则是对存储的指针地址做大小比较,而不是比较指针指向的C风格字符串内容。你代码里插入的"B"、"A"、"C"是字符串常量,它们的内存地址分配顺序刚好和你写入的顺序一致,所以最终遍历输出的顺序就和输入顺序相同,不会按字符串字典序排序。
修复方案
方案1:改用std::set<std::string>(最推荐)
std::string的默认比较规则就是字典序,不需要额外写自定义比较逻辑,修改后代码如下:
#include<iostream> #include<string> #include <set> using namespace std; int main() { std::set<std::string> cell_name; cell_name = {"B","A","C"}; for (const auto& str : cell_name) cout << ' ' << str; cout << '\n'; // 如果要逆序排序,改用std::set<std::string, greater<std::string>>即可 return 0; }
运行后输出就是你期望的 A B C。
方案2:给std::set<char*>自定义比较函数
如果必须用char*作为存储类型,需要手动传入按C字符串比较的排序规则:
#include<iostream> #include<string.h> #include <set> using namespace std; // 自定义比较器 struct CStrCompare { bool operator()(const char* a, const char* b) const { return strcmp(a, b) < 0; // 如果要逆序,改成strcmp(a,b) > 0即可 } }; int main() { std::set<char*, CStrCompare> cell_name; cell_name = {"B","A","C"}; std::set<char*, CStrCompare>::iterator iter; for (iter = cell_name.begin();iter!=cell_name.end();++iter) cout << ' ' << *iter; cout << '\n'; return 0; }
内容的提问来源于stack exchange,提问作者Play learn Kim
相关产品推荐
相关产品推荐

