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