#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)
这是正确的还是有更好的方法呢?
答案 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());