C字符串集

时间:2014-02-03 06:28:02

标签: 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;
}

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

1 个答案:

答案 0 :(得分: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:原始数组缺少的另一件事是内置副本和赋值,这也是大多数(如果不是全部)标准容器的要求。