我想對成員為 pair<int, int> 的向量進行排序。所以我寫了一個函式來比較兩對。它在功能位于外層空間時起作用。但是當我嘗試將其撰寫為成員函式時會引發錯誤。那么為什么會拋出錯誤呢?
#include <iostream>
#include <vector>
#include <string>
#include <set>
#include <map>
#include <algorithm>
#include <stack>
#include <queue>
using std::pair;
using std::vector;
using std::sort;
using std::endl;
using std::cout;
// bool cmp(const pair<int, int>& p1, const pair<int, int>& p2)
// {
// return p1.second < p2.second;
// }
class test
{
public:
bool cmp(const pair<int, int>& p1, const pair<int, int>& p2)
{
return p1.second < p2.second;
}
void my_sort(vector <pair<int, int>> &data)
{
sort(data.begin(), data.end(), cmp);
}
};
int main()
{
vector <pair<int, int>> data;
for(int i=10; i>=0; i--)
{
data.push_back(pair<int, int>(10-i, i));
}
test a;
a.my_sort(data);
// sort(data.begin(), data.end(), cmp);
for (auto &&i : data)
{
cout << i.first << '\t' << i.second << endl;
}
return 0;
}
uj5u.com熱心網友回復:
那么為什么會拋出錯誤呢?
因為cmp是一個非靜態成員函式,需要呼叫一個物件,所以不能用作std::sort.
要解決這個問題,您可以創建cmp一個static成員函式或在類外部(在全域命名空間)使用lambda或實作cmp,如下所示:
方法一
做cmp一個static成員函式。
class test{
//other members
public:
//make cmp static
static bool cmp(const pair<int, int>& p1, const pair<int, int>& p2)
{
return p1.second < p2.second;
}
void my_sort(vector <pair<int, int>> &data)
{
//-----------------------------------------vvvvvvvvv--->cmp doesn't require an object to be called
sort(data.begin(), data.end(), test::cmp);
}
};
演示 1
方法二
做cmp一個免費的功能。
//free function cmp outside class test
bool cmp(const pair<int, int>& p1, const pair<int, int>& p2)
{
return p1.second < p2.second;
}
class test
{
//code here as before
void my_sort(vector <pair<int, int>> &data)
{
//-------------------------------------vvv---->no change here
sort(data.begin(), data.end(), cmp);
}
};
演示 2
方法三
也可以lambda如下圖使用:
class test
{
public:
void my_sort(vector <pair<int, int>> &data)
{
//-------------------------------------vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv-->use lambda
sort(data.begin(), data.end(), [](const pair<int, int>& p1, const pair<int, int>& p2)->bool
{
return p1.second < p2.second;
}
);
}
};
演示 3
uj5u.com熱心網友回復:
為了使用帶有 std::sort 的成員函式,該函式必須宣告為靜態成員函式
uj5u.com熱心網友回復:
要呼叫非靜態成員函式,您需要提供將呼叫該函式的物件。
只需在類中定義test一個運算子函式并通過以下方式std::sort在成員函式中呼叫該函式my_sort
std::sort( std::begin( data ), std::end( data ), *this );
這是一個演示程式。
#include <iostream>
#include <utility>
#include <vector>
#include <iterator>
#include <algorithm>
class test
{
public:
bool operator ()( const std::pair<int, int>& p1, const std::pair<int, int>& p2 ) const
{
return p1.second < p2.second;
}
void my_sort( std::vector<std::pair<int, int>> &data ) const
{
std::sort( std::begin( data ), std::end( data ), *this );
}
};
int main()
{
std::vector <std::pair<int, int>> data;
for(int i=10; i>=0; i--)
{
data.push_back( std::pair<int, int>( 10-i, i) );
}
test a;
a.my_sort(data);
for (auto &&i : data)
{
std::cout << i.first << '\t' << i.second << std::endl;
}
}
您也可以通過以下方式呼叫該函式
test().my_sort( data );
或者
std::sort( std::begin( data ), std::end( data ), test() );
否則將成員函式宣告為靜態成員函式。例如
#include <iostream>
#include <utility>
#include <vector>
#include <iterator>
#include <algorithm>
class test
{
public:
static bool cmp( const std::pair<int, int>& p1, const std::pair<int, int>& p2 )
{
return p1.second < p2.second;
}
static void my_sort(std::vector <std::pair<int, int>> &data )
{
std::sort( std::begin( data ), std::end( data ), cmp );
}
};
int main()
{
std::vector <std::pair<int, int>> data;
for(int i=10; i>=0; i--)
{
data.push_back( std::pair<int, int>( 10-i, i) );
}
test::my_sort(data);
// std::sort( std::begin( data ), std::end( data ), test::cmp);
for (auto &&i : data)
{
std::cout << i.first << '\t' << i.second << std::endl;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/476935.html
上一篇:兩個反向排序陣列的時間復雜度
