模板,STL,C++

Cry*_*tal 2 c++ templates stl

我编写了这个例程来命令项目,只保留唯一的项目,它采用类型为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*?谢谢.

Geo*_*che 6

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)