C字符串集

sil*_*ker 1 c++ string

#include <iostream>
#include <set>
using namespace std;

int main() {
    // your code goes here
    set<char[10]> rno;
    rno.insert("208/CO/11");
    rno.insert("206/CO/11");
    rno.insert("209/CO/11");
    rno.insert("208/CO/11");
    set<char[10]>::iterator it;
    for(it=rno.begin();rno.end()!=it;it++)
        cout<<*it<<endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么这段代码不起作用?如果我用字符串替换char [10]它可以正常工作,但如果c ++是c的超集,为什么这个关联容器与c字符串不兼容?

Bor*_*der 7

问题是std::set需要比较器,默认情况下是operator<.您的问题是没有为原始数组定义任何逻辑运算符.

但是,std::string确实有operator<定义,所以这就是它的原因,std::string但不是char[10].

但是,如果您愿意,您可以提供自己的,但除非您需要标准库未提供的特定内容,否则使用std::string是可行的方法.你也可以使用std::array<char, 10>,甚至std::vector<char>两者都operator<定义了.

附录:这可以工作(并且通过工作我的意思是编译),如果你有,char*因为指针是内存地址可以使用operator<.但是它不会做你期望的,因为它实际上会根据每个char数组的地址对集合的内容进行排序,而不是按字典顺序比较每个字符串.这就是为什么std::set<std::string>是优越的选择.

附录#2:原始数组缺少的另一件事是内置副本和赋值,这也是大多数(如果不是全部)标准容器的要求.