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

时间:2014-04-30 14:30:39

标签: c++ string sorting int

所以我需要按数字顺序对字符串向量进行排序。我使用sort function,它几​​乎可以使用。假设我有已转换为字符串的数字10, 20, 5, 200, 50, 75。 sort函数对它们进行排序:10, 200, 25, 5, 50, 75。所以它只是排序我想的第一个角色?是否有 easy 方法让它排序超过第一个字符?是的,它们必须转换为字符串以供我特定使用。

谢谢!

3 个答案:

答案 0 :(得分:3)

查看以下代码:

#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;
}

答案 1 :(得分:2)

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

对包含整数的字符串向量进行排序的最简单方法可能是将其转换为整数,然后对其进行排序,然后将字符串转换回第一个向量...如果不进行转换,在您的情况下可能会更高效首先是字符串。

关于在比较器内即时转换为int的建议,这将是昂贵的。与从intstring的转换过程相比,int的比较微不足道。排序是O(N log N)(预期)比较次数,如果您即时转换,您将进行O(N log N)次转化,如果您转换后将进行O(N)次转化并O(N log N)琐碎的int比较。

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

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。如果数字可以为负数,您可以进一步扩展比较器以检测符号,然后应用类似于上面的比较的东西。

答案 2 :(得分:0)

您可以使用标准地图吗?

// 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";

你也可以写一个40的两个例子。您可以使用自己的谓词来比较字符,而不是stoi。如果lhs的数字少于rhs,则lhs必须是较小的数字(假设没有浮点数);如果数字的位数与比较字符串相同(即David Rodriguez在答案中向您显示的内容)。当我写下答案时,我没有注意到他已经建议过了。我添加的唯一额外的东西是使用另一个容器(即std :: map)的建议。