我编写了这个例程来命令项目,只保留唯一的项目,它采用类型为T的数组,以及数组的大小.它在处理后返回数组的新大小.
template <class T>
int reduce(T array[], int size) {
T *begin = array;
T *end = array + size;
sort(begin, end);
T *end_new = unique(begin, end);
return end_new - array;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是我期待它对const char*数据进行排序
{"aa", "bb", "bc", "ca", "bc", "aa", "cc", "cd", "ca", "bb"};
into //aa bb bc ca cc cd
Run Code Online (Sandbox Code Playgroud)
然而它却采取相反的方式:"cd cc ca bc bb aa"为什么会这样做?它不使用标准字符串比较吗?如果我想,我怎么能改变它所以它会按字母顺序排序const char*?谢谢.
sort()operator<默认情况下使用,这只会比较您案例中的地址.
如果要对C字符串进行排序,则必须将比较器传递给sort().要做到这一点,你可以让用户通过一个比较器,在比较器函数上使用特化或这些的组合:
template<class T> bool my_comp(T a, T b) {
return a < b;
}
template<> bool my_comp<const char*>(const char* a, const char* b) {
return std::strcmp(a, b) < 0;
}
template<class T, class Comp>
int reduce(T array[], size_t size, Comp comp = my_comp<T>) {
// ...
std::sort(begin, end, comp);
// ...
}
Run Code Online (Sandbox Code Playgroud)