我有一个包含字母数字字符串的 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/