You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 10:57:03