[英]C++: std::sort using already destroyed object with custom predicate?
[英]Sort by using an integer number in C++ (custom usage of std::sort)
我想要一個首先按數字排序的字符串列表,如果數字等於0,則按字母順序對其進行排序。
假設我有:
struct numberedString{
string s;
int n;
}
我有一個數組numberedString a[]
如何使用std::sort()
對數組中的條目進行std::sort()
? 我想我首先需要的所有排序numberedString.s
由排序,然后numberedString.n
,但我看不出究竟是如何做到這一點?
問你應接受。 干得好。
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。
順便說一句,當一個變量的數量為零而另一個變量沒有為零時,有哪些規則呢?
基本上,您的結構非常瑣碎,可以將其替換為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';
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.