对已转换为字符串的int向量进行排序
Sorting a vector of ints that have been converted into strings
所以我需要按数字顺序对字符串向量进行排序。我正在使用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
的建议,这将是昂贵的。与从string
到int
的转换过程相比,比较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(。
- 将结构向量排序为子组
- C++数组与向量排序(在我的情况下,向量比数组慢~2.5倍(无优化))
- 如何在对向量排序后更改索引值?c++
- C++向量排序给出0作为输出
- 将许多向量排序在一起
- 根据一个向量对多个向量排序
- 编译错误向量排序和联合
- C++我自己的函数进行向量排序
- 将字符串的向量排序为日期"yyyymmdd"
- C++ 通过使用旧向量进行预排序来改进向量排序
- C 向量排序 .h .cpp中的单独文件
- 向量排序-c++
- 将向量排序到一个无序映射c++11中
- 向量的向量排序
- c++向量排序方法编译失败,返回预期表达式
- 如何对bitset向量排序
- 向量排序的基础上只有先
- 我如何以相同的方式对两个向量排序,而条件只使用其中一个向量
- 列表排序和结构体向量排序之间的性能差距.c++
- 如何基于第二个字符串对字符串向量的向量排序