【发布时间】:2018-03-07 00:02:33
【问题描述】:
很抱歉,如果有人问过这个问题,但我无法找到我正在寻找的答案。
我有一个 std::string 指针向量,我想按字母顺序排序,但我无法弄清楚如何做到这一点。我正在使用 std::sort。
我写了一个quick program 来测试我想要做什么(因为在实际实现中,我的代码是在子进程中运行的,所以调试起来有点困难):
#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;
}
当我运行它时,我得到这个输出:
$ ./strsort
xylophone
bfuen
xxxxx
aaaaa
AAAAA
这似乎根本没有按字母顺序排列,所以我可以假设我使用 sort() 错误或者我的比较器函数有问题。我也尝试过没有比较器功能,我认为这只是根据它们的内存位置从最小到最大对它们进行排序,这实际上并没有改变任何东西。我也尝试过使用
bool cmpStrPtrs(std::string *a, std::string *b) {
return a->compare(*b);
}
但它给了我同样的结果。
如果相关,我正在使用 c++17 标准使用 g++ 进行编译。
【问题讨论】:
-
使用
new是非惯用的 C++。你的比较函数也是错误的(让我们从“你从一个应该返回bool的函数返回一个int”开始)另见en.cppreference.com/w/cpp/concept/Compare -
我不建议在标记为返回
bool的函数中返回-1、0、+1 -
您确定要
vector<string*>而不仅仅是vector<string>?我看不出额外的间接增加了什么价值。