我有一个vector<string>容器,但字符串都是数字
编辑:我尝试过这个:
所以现在逻辑似乎很无聊
清理了这个,但是尝试将 std::string 转换为 int 的各种尝试很难,lamba 是无用的,并且我已经没有了在没有出现任何错误的情况下转换 std::string 的想法
template<typename Iterator>void bubbleSort(Iterator first, Iterator last){
Iterator i, j;
for (i = first; i != last; i++)
for (j = first; j < i; j++)
if (*i < *j)
std::iter_swap(i, j); // or std::swap(*i, *j);
}
Run Code Online (Sandbox Code Playgroud)
我读取源数据的代码是
void loadgames(void) { // read the game app id's
ifstream inFile;
ofstream outFile;
string s;
inFile.open("game-list.txt");
if (inFile.is_open()) {
while (std::getline(inFile, s)) {
if(s.length() > 0)
gamelist.push_back(s);
};
inFile.close();
}
// bubbleSort(gamelist.begin(),gamelist.end());
outFile.open("game-list.txt");
if (outFile.is_open()) {
for (i = gamelist.begin(); i != gamelist.end(); i++) {
outFile << *i << endl;
}
}
outFile.close();
Run Code Online (Sandbox Code Playgroud)
}
调用的是对我的向量进行排序的问题
bubbleSort(gamelist.begin(),gamelist.end());
Run Code Online (Sandbox Code Playgroud)
如您所知,您可以std::sort()与自定义比较器一起使用。问题是你的compare设置错误。它的参数必须是容器的value_type,而不是容器类型。而且你.里面有一个错误。
试试这个:
std::vector<std::string> gamelist;
// fill gamelist as needed...
auto compare = [](const std::string &a, const std::string &b){
return std::stoi(a) < std::stoi(b);
};
std::sort(gamelist.begin(), gamelist.end(), compare);
Run Code Online (Sandbox Code Playgroud)
但是,我建议改用std::vector<int>(或适当的整数类型,具体取决于您的字符串内容),并在将它们插入 之前简单地将std::strings 解析为整数(或等效项) ,例如:std::stoi()std::vector
std::vector<int> gamelist;
// fill gamelist as needed...
gamelist.push_back(std::stoi(someString));
...
std::sort(gamelist.begin(), gamelist.end());
Run Code Online (Sandbox Code Playgroud)
这将消耗更少的内存,排序速度更快,并且会降低排序的复杂性,因为您只会预先一次将字符串转换为整数,而不是在排序算法的每次迭代中都会产生开销(可能会解析相同的字符串)一遍又一遍地串起来)。