【发布时间】:2020-10-22 12:10:59
【问题描述】:
免责声明:自从我编写任何 C/C++ 以来,已经过去了大约 5 年。我通常用python编写代码。
我有一个字符串向量,我想以某种方式(按长度)排序,所以我编写了自己的比较器函数:
bool sortSubstrs(string a, string b)
{
if (a.length() > b.length()) { return true; }
else { return false; }
}
我最初有一个错误,所以我输入了一个打印语句(是的,我知道我应该使用 ide,但我很懒,只使用 vim):
bool sortSubstrs(string a, string b)
{
cout << a.length() + " " + b.length() << endl;
if (a.length() > b.length()) { return true; }
else { return false; }
}
我预计它会打印 a 和 b 的长度,但它会打印一堆看似“随机”的东西,来自堆栈的早期(我猜)。
这是一个完整的、最小的重现示例:
sort_words.cpp:
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
vector<string> to_vector(char* filename) // read from file and put into a vector
{
vector<string> karray;
FILE *ifile = fopen(filename, "r");
int ch;
int idx = 0;
string s1 = "";
while( EOF != (ch=getc(ifile)))
{
if ('\n' == ch)
{
karray.push_back(s1);
s1 = "";
} else {
string s2(1,ch);
s1 = s1 + s2;
}
}
fclose(ifile);
return karray;
}
bool sortSubstrs(string a, string b)
{
cout << a.length() + " " + b.length() << endl;
if (a.length() > b.length()) { return true;}
else { return false;}
}
void sort_words(char* filename){
vector<string> wordArray;
wordArray = to_vector(filename);
sort(wordArray.begin(), wordArray.end(), sortSubstrs);
wordArray.erase(unique(wordArray.begin(), wordArray.end()), wordArray.end());
//print out the sorted array
for (unsigned n=0; n < wordArray.size(); n++) {cout << wordArray.at(n) << "\n";}
}
int main(int argc, char *argv[])
{
if (FILE *ifile = fopen(argv[1], "r")){
fclose(ifile);
sort_words(argv[1]);
} else {
cout << "file doesn't exist" << endl;
return 1;
}
}
还有一个 input.txt 文件:
sh
zsh
bash
使用 g++(在 centos7 上运行 4.8.5)编译没有错误:
g++ sort_words.cpp -o sort_words
运行./sort_words input.txt 会给出以下输出:
ile doesn't exist
e doesn't exist
bash
zsh
sh
我认为可能存在/可读文件的主要签入以某种方式搞砸了,所以我重写了它:
int main(int argc, char *argv[]) { sort_words(argv[1] }
但是使用相同的输入文件重新编译和运行会得到这个输出:
ector::_M_insert_aux
tor::_M_insert_aux
bash
zsh
sh
使用更长的输入文件只会以类似的模式打印出更多这些“损坏”的字符串。那么,到底发生了什么?我的记忆有点模糊,但我知道大多数排序算法都是递归的(看起来 C++ 使用混合递归排序方法:Wikipedia: sort (C++)),但无论如何递归都发生在 within排序函数和(我认为)排序函数无法访问内存中的其他函数。
使用自定义比较器是否会显着改变排序功能的工作方式?我的理解是,在 sort 函数内部,它只会调用自定义函数而不是默认的 > 或
【问题讨论】:
-
离题,但您的比较器可能会占用
const string& -
顺便说一句,你为什么使用
fopen()和getc(),而不是使用std::ifstream和std::getline()?此外,您的比较器应该通过 const 引用而不是值来获取strings。 -
@RemyLebeau 老实说,我真的很生疏。 8 年前我在大学上过一门 C++ 课程,然后很快就忘记了一切,所以我现在只是在拼凑一些东西。不过感谢您的建议!
-
sortSubstrs可以更经济地编码为return a.length() > b.length();
标签: c++ string sorting recursion vector