C++ 字符串指针的排序向量
我很抱歉,如果这已经被问到的地方,但我还没有找到一个答案,我正在寻找 我有一个std::string指针向量,我想按字母顺序排序,但我还没有弄清楚如何做到这一点。我正在使用std::sort 我写了一篇文章来测试我试图做什么,因为在实际实现中,我的代码是在子进程中运行的,所以调试有点困难:C++ 字符串指针的排序向量,c++,sorting,vector,C++,Sorting,Vector,我很抱歉,如果这已经被问到的地方,但我还没有找到一个答案,我正在寻找 我有一个std::string指针向量,我想按字母顺序排序,但我还没有弄清楚如何做到这一点。我正在使用std::sort 我写了一篇文章来测试我试图做什么,因为在实际实现中,我的代码是在子进程中运行的,所以调试有点困难: #include <string> #include <algorithm> #include <vector> #include <string.h> bo
#include <string>
#include <algorithm>
#include <vector>
#include <string.h>
bool cmpStrPtrs(std::string *a, std::string *b) {
std::string a1 = *a;
std::string a2 = *b;
if(a1 == a2) return 0;
return a1 > a2 ? 1 : -1;
}
int main(int argc, char *argv[]) {
std::vector<std::string *> vec;
std::string *str1 = new std::string("AAAAA");
std::string *str2 = new std::string("aaaaa");
std::string *str3 = new std::string("xxxxx");
std::string *str4 = new std::string("bfuen");
std::string *str5 = new std::string("xylophone");
vec.push_back(str1);
vec.push_back(str2);
vec.push_back(str3);
vec.push_back(str4);
vec.push_back(str5);
std::sort(vec.begin(), vec.end(), cmpStrPtrs);
for(std::string *str : vec) {
printf("%s\n", str->c_str());
}
return 0;
}
这看起来根本不是按字母顺序排列的,所以我可以假设我使用的排序错误,或者我的比较器函数有问题。我也尝试过不使用比较器函数,我认为这只是根据它们的内存位置从最小到最大排序,实际上不会改变任何东西。我也试过使用
bool cmpStrPtrs(std::string *a, std::string *b) {
return a->compare(*b);
}
但它给了我同样的结果
如果相关的话,我正在使用c++17标准使用g++进行编译。您可以使用lambda进行编译:
std::sort(vec.begin(), vec.end(), [](std::string * a, std::string * b) {
return *a < *b;
});
您可以使用lambda执行此操作:
std::sort(vec.begin(), vec.end(), [](std::string * a, std::string * b) {
return *a < *b;
});
您的比较函数是-这意味着如果a在b之前,它应该返回true。如果a不等于b,则当前实现返回true 你有:
if(a1 == a2) return 0;
return a1 > a2 ? 1 : -1;
应该是:
if(a1 == a2) return false;
return a1 > a2 ? false : true;
或者只是:
return a1 < a2;
您的比较函数是-这意味着如果a在b之前,它应该返回true。如果a不等于b,则当前实现返回true 你有:
if(a1 == a2) return 0;
return a1 > a2 ? 1 : -1;
应该是:
if(a1 == a2) return false;
return a1 > a2 ? false : true;
或者只是:
return a1 < a2;
string::compare返回一个int,而不是bool。根据返回值是多少
如果*为负值,则按字典顺序显示在参数指定的字符序列之前
如果两个字符序列比较相等,则为零
正值,如果*该值出现在参数指定的字符序列之后,按强文本的字典顺序排列
返回值被强制转换为bool,对于所有非零值,bool的计算结果为true。这意味着您的函数为每一对不相同的字符串返回true
C++标准实际上定义了操作符
STD::String::比较返回int,而不是布尔。根据返回值是多少
如果*为负值,则按字典顺序显示在参数指定的字符序列之前 如果两个字符序列比较相等,则为零 正值,如果*该值出现在参数指定的字符序列之后,按强文本的字典顺序排列 返回值被强制转换为bool,对于所有非零值,bool的计算结果为true。这意味着您的函数为每一对不相同的字符串返回trueC++标准实际上定义了操作符
STD::排序期望它不给相等的垃圾;它只关心前后
如果右侧在左侧之前,则比较函数应返回true。不幸的是bool cmpStrPtrs(std::string *a, std::string *b) {
std::string a1 = *a;
std::string a2 = *b;
if(a1 == a2) return 0;
return a1 > a2 ? 1 : -1;
}
对于任何非0的值,bool都为真。这意味着大于和小于均为真。这使得逻辑排序几乎不可能,因为大于和小于之前的值
改进切割1:返回基于字典字母顺序的bool。字符串已经实现了一个小于运算符,该运算符完全可以执行您想要的操作。让我们使用它
bool cmpStrPtrs(std::string *a, std::string *b) {
std::string a1 = *a;
std::string a2 = *b;
return a1 < a2;
}
sort期望它不会对equals一窍不通;它只关心前后
如果右侧在左侧之前,则比较函数应返回true。不幸的是
bool cmpStrPtrs(std::string *a, std::string *b) {
std::string a1 = *a;
std::string a2 = *b;
if(a1 == a2) return 0;
return a1 > a2 ? 1 : -1;
}
对于任何非0的值,bool都为真。这意味着大于和小于均为真。这使得逻辑排序几乎不可能,因为大于和小于之前的值
改进切割1:返回基于字典字母顺序的bool。字符串已经实现了一个小于运算符,该运算符完全可以执行您想要的操作。让我们使用它
bool cmpStrPtrs(std::string *a, std::string *b) {
std::string a1 = *a;
std::string a2 = *b;
return a1 < a2;
}
使用新的非惯用C++。你的比较函数也错了,让我们从一个应该返回bool的函数返回int开始,我不建议在一个标记为返回boolAre的函数中返回-1,0,+1,你确定你想要向量而不仅仅是向量吗?我不知道额外的间接值有什么价值。也可以阅读关于使用新的非惯用C++。你的比较函数也错了,让我们从一个应该返回bool的函数返回int开始,我不建议在一个标记为返回boolAre的函数中返回-1,0,+1,你确定你想要向量而不仅仅是向量吗?我看不出额外的间接性增加了什么价值。也读到了魔兽世界,我觉得自己像个白痴。我真不敢相信我竟然没有注意到我没有回一本书。去年我为我的算法课写了这么多java比较函数,这有点像自动驾驶仪。非常感谢。另外,我的代码有问题是对的,但是我使用字符串指针而不仅仅是字符串的原因是
应用程序的ng结构要求它们是指针。这只是一个快速的例子,我突然冒出来测试我试图做什么,而不是实际的实现。别担心,在实际代码中,它们会被删除。@AndrewGraber为什么它必须是指针?是因为它们不应该是复制品还是有更严格的理由?哇,我觉得自己像个白痴。我真不敢相信我竟然没有注意到我没有回一本书。去年我为我的算法课写了这么多java比较函数,这有点像自动驾驶仪。非常感谢。另外,我的代码有问题是对的,但是我使用字符串指针而不仅仅是字符串的原因是应用程序的底层结构要求它们是指针。这只是一个快速的例子,我突然冒出来测试我试图做什么,而不是实际的实现。别担心,在实际代码中,它们会被删除。@AndrewGraber为什么它必须是指针?这仅仅是因为它们不应该是复制品,还是有更严格的理由?