c++ - 使用 vector 对字母数字字符串进行排序

标签 c++ vector

我有一个包含字母数字字符串的 vector ,我想根据数值对 vector 进行排序。

例如,如果我的 vector 包含这些值:

name0 name20 name15 name3 name10,我排序后的 vector 应该是这样的:

name0 name3 name10 name15 namw20.

任何人都可以帮助如何做到这一点..?这是我的完整代码:

#include<vector>

#include<string>
#include <cstdlib>

#include <algorithm>
#include <iostream>
using namespace std;

int main()
{
        vector<string> temp;
        temp.push_back("name0");
        temp.push_back("name20");
        temp.push_back("name15");
        temp.push_back("name3");
        temp.push_back("name10");

        sort(temp.begin(), temp.end());


        for (vector<string>::size_type i = 0; i!= temp.size(); i++)
                cout << temp[i] << endl;


return 0;
}

最佳答案

假设使用 C++11,您可以使用 lambda 和 std::stoi 将字符串的有效部分转换为数字。

sort(temp.begin(), temp.end(), [] (const std::string& a, const std::string& b) { 
    std::string cmp_a { a.begin() + 4, a.end() };
    std::string cmp_b { b.begin() + 4, b.end() };
    return std::stoi(cmp_a) < std::stoi(cmp_b);
});

当然,如果转换失败,std::stoi 将抛出异常,因此请确保您传递给它的字符串仅包含数字。


在 C++03 中,您可以使用 Boost.Lexical_Cast :

int convert(const std::string& s, std::size_t pos)
{
    return boost::lexical_cast<int>(s.data() + pos, 
        std::distance(s.begin() + pos, s.end()));
}

bool predicate(const std::string& a, const std::string& b)
{
    return convert(a, 4) < convert(b, 4);
}

如评论中所述,4 是第一个数字出现的硬编码位置。如果不同,您可以使用 find_first_of :

const std::string numbers = "0123456789";

bool predicate(const std::string& a, const std::string& b)
{
    std::size_t a_start = a.find_first_of(numbers);
    std::size_t b_start = b.find_first_of(numbers);
    return convert(a, a_start) < convert(b, b_start);
}

Charles Salvia 已经写了一个更好的答案(不依赖于 Boost 或 C++11)。他链接到另一个评论提到的实现 natural sorting order 的页面。

关于c++ - 使用 vector 对字母数字字符串进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26350430/

相关文章:

c++ - DirectX 11 : Shader not creating world view matrix

c++ - 使用 vector 中的对象排序

c++ - 简称 vector 索引

android - 将 OpenCV 轮廓从 JNI C++ 函数传递到 Android 中的 Java

c++ - 这个方法声明/定义是什么意思? (与传递数组有关?)

c++ - 在虚幻引擎 C++ 中设置计时器

c - C中如何使用scanf同时扫描double和char到double数组中

C++ : alternative for Vector of references to avoid copying large data

haskell - 如何确保 Data.Vector 的分摊 O(n) 级联?

python - 查找与集合中所有向量的距离大致相等的向量