C++ 如何对向量进行排序<;字符*>;? #包括 布尔比较函数(char*c1,char*c2) { 返回strcmp(c1,c2)?0:1; } 载体myVec; 向量::迭代器itr; 排序(myVec.begin()、myVec.end()、comparisonFunc)

C++ 如何对向量进行排序<;字符*>;? #包括 布尔比较函数(char*c1,char*c2) { 返回strcmp(c1,c2)?0:1; } 载体myVec; 向量::迭代器itr; 排序(myVec.begin()、myVec.end()、comparisonFunc),c++,string,sorting,vector,C++,String,Sorting,Vector,这是正确的还是有更好的方法呢?std::sort需要一个“小于”谓词。您应该像这样实现您的comparisonFunc(): #include <algorithm> bool comparisonFunc(char* c1, char* c2) { return strcmp(c1, c2) ? 0 : 1; } vector<char*> myVec; vector<char*>::iterator itr; sort(myVec.begin

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

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

#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)
bool comparisonFunc(常量字符*c1,常量字符*c2)
{
返回strcmp(c1,c2)<0;
}
(注意
const
s;它们很重要。)


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

我更想对指向记录的指针向量进行排序,而不仅仅是简单的C字符串

bool comparisonFunc(const char *c1, const char *c2)
{
    return strcmp(c1, c2) < 0;
}
模板
struct std::less
{
布尔运算符()(常量foo*lhs,常量foo*rhs)常量
{
返回strcmp(左侧->键,右侧->键);
}
};
这将重新定义foo*的比较,以便默认比较在排序中起作用。对我来说,这种风格更具陈述性,而另一种则更具程序性。如果您需要多个订单,那么使用默认值是有问题的;如果您想确保所有已排序的foo*s集合都处于相同的顺序,这很好

    template<>
    struct std::less<const foo*>
    {
       bool operator()(const foo* lhs, const foo* rhs) const
       {
          return strcmp(lhs->key, rhs->key);
       }
    };
std::vector db;
排序(db.begin(),db.end());

<代码> > p>用现代C++,可以定义比较方法内联:

std::vector<foo*> db;
std::sort(db.begin(), db.end());
std::向量字符串;
/*填充字符串向量*/
排序(strings.begin()、strings.end()、[](常量字符*lhs、常量字符*rhs){
返回strcmp(左侧、右侧)<0;
});

请注意,
strcmp
返回-1/0/+1以表示有序性,因此比较
<0

itr
似乎未使用。和
strcmp(…)?0:1
的书写方式会更加习惯化
!strcmp(…)
。但是我不知道你实际问题的答案。@user1002288为什么不使用
std::sort(myVec.begin(),myVec.end(),::strcmp)
directlt?注意:
strcmp
根据c1是否为c2返回-1、0或+1。因此,您需要
strcmp(lhs,rhs)<0
来执行小于排序。为什么常量在这里很重要?std::sort不会让您在只想知道哪个容器更小时修改容器的内容。bool comparisonFunc(const char*c1,const char*c2)const{}如何?为什么不
std::sort(myVec.begin(),myVec.end(),::strcmp);直接?
strcmp()
不小于。它不能直接用作排序的谓词。您的意思是
返回strcmp(…)<0?在国际海事组织,这是相当有问题的。您使
foo\u p1
std::less()(foo\u p1,foo\u p2)
的行为不同,而且后者的结果与
std::less()(foo\u p1,foo\u p2)
不同。。。。该标准甚至没有建议排序算法默认使用std::less。你的代码片段充满了错误,一天结束时根本不需要工作。呃,我对strcmp()的看法不好,对不起。标准对Tstd::vector<const char*> strings; /* fill strings vector */ std::sort(strings.begin(), strings.end(), [](const char* lhs, const char* rhs) { return strcmp(lhs, rhs) < 0; });