2011-10-22 46 views
4
#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) 

这是正确的还是有更好的方法来做到这一点?如何排序矢量<char*>?

+1

'itr'似乎未被使用。和'strcmp(...)? 0:1'会更习惯性地写成'!strcmp(...)'。但我不知道你的实际问题的答案。 – zwol

+0

@ user1002288为什么不使用'std :: sort(myVec.begin(),myVec.end(),:: strcmp);'directlt? –

回答

11

std::sort需要一个“小于”谓词。你应该实现你comparisonFunc()这样的:

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

(注意const秒;他们是非常重要的。)

您当前的执行不可能工作,因为你刚刚返回,如果这两个值相等或不。这些信息不足以进行排序 - 您需要知道哪一个较小,哪一个更大(当然,除非值相等)。

+0

为什么const在这里很重要? – user1002288

+0

std :: sort当它只想知道哪一个更小时,绝不会让你修改容器的内容。 – hrnt

+0

bool compareFunc(const char * c1,const char * c2)const {}? – user1002288

-1

我更多的时候想指针的矢量排序,以比只是普通的C字符串记录...

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

这重新定义富的比较*使得默认的比较中的排序工作。对我而言,这种风格感觉更具说明性,另一种更具程序性。如果您需要多个订单,则默认情况下的使用是有问题的;如果你想确保所有有序的foo *集合都是相同的顺序,那就很好。

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

难道你不是指'返回strcmp(...)<0;'? –

+0

IMO,这是相当有问题的。你使'foo_p1 ()(foo_p1,foo_p2)'的行为不同,另外后者的结果与'std :: less ()(foo_p1,foo_p2)'不同。 – UncleBens

+0

......并且标准甚至似乎没有建议排序算法默认使用std :: less。你的片段充满了错误,在一天结束时根本不需要工作。 – UncleBens