使用数值数据对 std::vector<std::string> 进行排序

0 c++ quicksort

我有一个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)

Rem*_*eau 6

如您所知,您可以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)

在线演示

这将消耗更少的内存,排序速度更快,并且会降低排序的复杂性,因为您只会预先一次将字符串转换为整数,而不是在排序算法的每次迭代中都会产生开销(可能会解析相同的字符串)一遍又一遍地串起来)。

  • @HardcoreGames `std::sort` 需要 `O(nlogn)` 比较,并且建议的解决方案会为每次比较转换字符串。如果转换为“std::vector&lt;int&gt;”,排序,然后将其转换回来,成本更低,我不会感到惊讶,因为它只需要“O(n)”转换 (2认同)