对已转换为字符串的int向量进行排序

Sorting a vector of ints that have been converted into strings

本文关键字:向量 排序 int 转换 字符串      更新时间:2023-10-16

所以我需要按数字顺序对字符串向量进行排序。我正在使用sort函数,它几乎可以工作。假设我有已转换为字符串的数字10, 20, 5, 200, 50, 75。sort函数对它们进行如下排序:10, 200, 25, 5, 50, 75。所以我想它只是对第一个字符进行排序?有没有一种简单的方法可以让它排序超过第一个字符?是的,为了我的特殊用途,它们必须转换成字符串。

谢谢!

查看以下代码:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
int main()
{
  std::vector<std::string> v {"123", "453", "78", "333"};
  std::sort(std::begin(v), std::end(v), [] (std::string const &A, std::string const &B) { return std::stoi(A) < std::stoi(B);});
  for(auto i : v) std::cout << i << std::endl;
}

真正的问题是,为什么要在它成为字符串向量之后而不是在此之前对其进行排序。

对包含int的字符串向量进行排序的最简单方法可能是将其转换为int,对其进行排序,然后将其转换回第一个向量中的字符串。。。在您的情况下,如果您一开始就不转换为字符串,这可能会更有效。

关于在比较器内动态转换为int的建议,这将是昂贵的。与从stringint的转换过程相比,比较int是微不足道的。排序是O(N log N)(预期(的比较数,如果你在飞行中转换,你将进行O(N log N)转换,如果你转换一次,你将执行O(N)转换和O(N log N)琐碎的int比较。

你也可以手工制作一个算法来进行比较。如果您可以假设所有值都是正数,并且没有前导零,则表示为字符串的数字比表示为长度较短的字符串的任何其他数字都要大。你可以用它来构建一个comparisson函数:

struct Compare {
    bool operator()(std::string const & lhs, std::string const & rhs) const {
        return lhs.size() < rhs.size()
            || (lhs.size() == rhs.size() && lhs < rhs);
    }
};

如果可以有前导零,那么很容易找到前导零的数量,并在比较器内相应地调整size。如果数字可以是负数,您可以进一步扩展比较器以检测符号,然后应用类似于上面的comparison的东西。

您可以使用标准映射吗?

// now since map is already sorted by keys, you look up on the integer to get the equivalent string.
std::map<int, string> integersAndStrings;
integersAndStrings[1] = "one";
integersAndStrings[2] = "two";
integersAndStrings[3] = "three";

您也可以编写40two示例的变体。代替stoi,您可以制作自己的谓词来比较字符。如果lhs的位数少于rhs,则lhs必须是一个较小的数字(假设没有浮点(;如果数字数量相同,则比较字符串(即David Rodriguez在回答中向您展示的内容(。当我写下答案时,我没有注意到他已经提出了这个建议。我添加的唯一附加内容实际上是建议使用另一个容器(即std::map(。