【问题标题】:Sorting a vector of ints that have been converted into strings对已转换为字符串的整数向量进行排序
【发布时间】:2014-06-16 22:31:46
【问题描述】:

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

谢谢!

【问题讨论】:

  • 排序算法的性能有多重要?简单的答案是使用 boost::lexical_cast 之类的东西对底层整数值进行排序。
  • 可能是在做字符串比较。你可以在它仍然是整数向量的时候对其进行排序吗?
  • @Chad 不是很关键。这是一个非常非常小的向量。它最多可以包含 20 个元素。
  • 对于 20 个元素,任何事情都会发生...转换、排序和转换,或者即时排序转换...可能不值得开发专门的比较器来优化它。

标签: c++ string sorting int


【解决方案1】:

看下面这段代码:

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

【讨论】:

    【解决方案2】:

    问题实际上是为什么要在它成为字符串向量之后而不是在那之前对其进行排序。

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

    关于在比较器内部即时转换为int 的建议,这将是昂贵的。与从stringint 的转换过程相比,比较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。如果数字可能是负数,您可以进一步扩展比较器以检测符号,然后应用类似于上述比较的内容。

    【讨论】:

      【解决方案3】:

      你能用标准地图代替吗?

      // 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 必须是较小的数字(假设没有浮点数);如果与比较字符串的位数相同(即大卫罗德里格斯在他的回答中向您展示的内容)。我没有注意到他在我写答案时已经提出了这个建议。我要添加的唯一附加内容实际上是建议使用另一个容器(即 std::map)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多