如何对vector <char *>?</char *>进行排序

时间:2011-10-22 00:02:44

标签: c++ string sorting vector

#include <algorithm>

bool comparisonFunc(char* c1, char* c2)
{
     return strcmp(c1, c2) ? 0 : 1;
}

vector<char*> myVec;
vector<char*>::iterator itr;
sort(myVec.begin(), myVec.end(), comparisonFunc)

这是正确的还是有更好的方法呢?

3 个答案:

答案 0 :(得分:11)

std::sort期望一个“小于”的谓词。您应该像这样实施comparisonFunc()

bool comparisonFunc(const char *c1, const char *c2)
{
    return strcmp(c1, c2) < 0;
}

(注意const;它们很重要。)

您当前的实现可能无法正常工作,因为您只需返回值是否相等。这些信息不足以排序 - 您需要知道哪一个更小,哪一个更大(当然,除非值相等)。

答案 1 :(得分:0)

使用现代C ++,您可以内联定义比较方法:

std::vector<const char*> strings;
/* fill strings vector */
std::sort(strings.begin(), strings.end(), [](const char* lhs, const char* rhs) {
    return strcmp(lhs, rhs) < 0;
});

请注意,strcmp返回-1 / 0 / + 1表示序数,因此返回< 0

答案 2 :(得分:-1)

我更经常想要一个指向记录的指针向量,而不仅仅是普通的C字符串......

    template<>
    struct std::less<const foo*>
    {
       bool operator()(const foo* lhs, const foo* rhs) const
       {
          return strcmp(lhs->key, rhs->key);
       }
    };

这重新定义了foo *的比较,使得默认比较在排序中起作用。对我来说,这种风格更具说服力,另一种更具程序性。如果您需要多次订购,则使用默认值是有问题的;如果你想确保foo * s的所有有序集合的顺序都相同,那就好了。

std::vector<foo*> db;
std::sort(db.begin(), db.end());