我想要一个首先按数字排序的字符串列表,如果该数字等于0,则按字母顺序排序。
让我说我有:
numberedString a[]
我有一个数组std::sort()
如何使用numberedString.s
对数组中的条目进行排序?我想我首先需要对所有numberedString.n
进行排序,然后按{{1}}进行排序,但我不明白这是怎么做到的?
答案 0 :(得分:1)
问你,你会收到。干得好。
struct functor
{
bool operator() (const numberedString& a,
const numberedString& b)
{
if ((a.n != 0) && (b.n != 0))
{
return a.n < b.n;
}
return a.s < b.s;
}
};
struct numberedString
{
string s;
int n;
bool operator<(const numberedString& other) const
{
if ((n != 0) && (other.n != 0))
{
return n < other.n;
}
return s < other.s;
}
};
用法:
重载operator<
允许函数自然地比较结构的实例:
numberedString c, d;
if (c < d)
{
cout << "c < d\n";
}
else
{
cout << "c >= d\n";
}
仿函数允许您将比较算法传递给排序函数,如std::sort
:
numberedString array[25];
std::sort(&array[0], &array[25], functor);
注意:请参阅std :: sort以获取确切的语法。
BTW,当一个变量的数量为零而另一个变量的数量为零时,有哪些规则?
答案 1 :(得分:-1)
基本上,您的结构非常简单,您可以用std::pair
替换它。
using numberedString = std::pair<int, std::string>;
然后你可以按照普通的方式使用std::sort
,并且由于std::pair
词典比较,你可以获得所需的效果,简单并且无需定义自定义比较器(以下示例):
#include <iostream>
#include <utility>
#include <vector>
#include <string>
#include <algorithm>
using numberedString = std::pair<int, std::string>;
int main() {
numberedString vec1[] = {{4, "four"}, {2, "two"}, {1, "one"}};
std::sort(std::begin(vec1), std::end(vec1));
for(auto &&i : vec1) std::cout << i.first << " -- " << i.second << '\n';
std::cout << std::endl;
numberedString vec2[] = {{0, "four"}, {0, "two"}, {0, "one"}};
std::sort(std::begin(vec2), std::end(vec2));
for(auto &&i : vec2) std::cout << i.first << " -- " << i.second << '\n';
}