模板,STL,C ++

我编写了这个例程来命令项目,只保留唯一的项目,它采用类型为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;
}
我的问题是我期待它对const char *数据进行排序
{"aa", "bb", "bc", "ca", "bc", "aa", "cc", "cd", "ca", "bb"};
into //aa bb bc ca cc cd
然而它却采取相反的方式:“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);
    // ...
}
    
std :: sort使用&lt;默认情况下,&lt;在chars上与他们的词典排序无关。您可以提供一个额外的参数来排序以告诉它如何比较,或者您可以使用std :: string或类似的数组而不是char。     
const char*
<
操作符执行指针比较,而不是字符串数据比较。要么使用
std::string
作为字符串数据,要么使用special9ѭ,以便使用基于
strcmp
的特殊比较器调用sort。我猜你得到了你输出的输出,因为你的编译器决定在内存中反向按字母顺序排列它的所有字符串常量。
unique
也没有做任何事情 - 它只能起作用,因为你的编译器在编译时汇集了内存中的所有字符串,所以所有的12个字符串都会使用相同的内存。如果从文件中读取完全相同的字符串,则数组不会更改。这个问题的解决方案是一样的。     

要回复问题请先登录注册