我认为使用std::lexicographical_compare比提取子字符串更有效。
std::lexicographical_compare的作用是就地比较子字符串,因此您不需要支付将它们复制出去的成本。
像这样:
std::vector<std::string> v
{
"12345 QWERTY",
"23456 ASDFGH",
"34567 ZXCVBN",
};
std::sort(std::begin(v), std::end(v), [](std::string const& a, std::string const& b){
return std::lexicographical_compare(std::begin(a), std::begin(a) + 5, std::begin(b), std::begin(b) + 5);
});
std::cout << "By first column" << '\n';
for(auto const& s: v)
std::cout << s << '\n';
std::sort(std::begin(v), std::end(v), [](std::string const& a, std::string const& b){
return std::lexicographical_compare(std::begin(a) + 6, std::end(a), std::begin(b) + 6, std::end(b));
});
如果您需要频繁地进行这种操作,那么您可以将其包装在一个特殊的比较器中,如下所示:
struct substring_compare
{
std::size_t from;
std::size_t len;
substring_compare(std::size_t from, std::size_t len)
: from(from), len(len) {}
bool operator()(std::string const& a, std::string const& b) const
{
assert(from + len <= a.size());
assert(from + len <= b.size());
auto beg_a = std::begin(a) + from;
auto end_a = beg_a + len;
auto beg_b = std::begin(b) + from;
auto end_b = beg_a + len;
return std::lexicographical_compare(beg_a, end_a, beg_b, end_b);
}
};
int main()
{
std::vector<std::string> v
{
"12345 QWERTY",
"23456 ASDFGH",
"34567 ZXCVBN",
};
std::sort(std::begin(v), std::end(v), substring_compare(0, 5));
std::cout << "By first column" << '\n';
for(auto const& s: v)
std::cout << s << '\n';
std::sort(std::begin(v), std::end(v), substring_compare(6, 6));
std::cout << "By second column" << '\n';
for(auto const& s: v)
std::cout << s << '\n';
}
输出:
By first column
12345 QWERTY
23456 ASDFGH
34567 ZXCVBN
By second column
23456 ASDFGH
12345 QWERTY
34567 ZXCVBN
std::sort
函数以用于排序,您尝试过这样做吗? - Algirdas Preidžiusstruct { int id; string qwerty;}
的向量,然后你可以轻松地按照需要对它们进行排序。 - 463035818_is_not_a_number