亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用成員函數作為比較器進行問題排序

使用成員函數作為比較器進行問題排序

C++
心有法竹 2019-12-15 15:08:03
嘗試編譯以下代碼時,出現此編譯錯誤,該怎么辦?ISO C ++禁止使用不合格或帶括號的非靜態成員函數的地址形成指向成員函數的指針。class MyClass {   int * arr;   // other member variables   MyClass() { arr = new int[someSize]; }   doCompare( const int & i1, const int & i2 ) { // use some member variables }    doSort() { std::sort(arr,arr+someSize, &doCompare); }}; 
查看完整描述

3 回答

?
慕的地8271018

TA貢獻1796條經驗 獲得超4個贊

doCompare必須是static。如果doCompare需要來自MyClass您的數據,可以MyClass通過更改以下內容將其用作比較函子:


doCompare( const int & i1, const int & i2 ) { // use some member variables } 

進入


bool operator () ( const int & i1, const int & i2 ) { // use some member variables } 

并致電:


doSort() { std::sort(arr,arr+someSize, *this); }

另外,不doSort缺少返回值嗎?


我認為應該可以使用std::mem_fun某種綁定將成員函數轉換為自由函數,但是目前確切的語法讓我回避了。


編輯: Doh,std::sort按值取函子可能是個問題。為了解決這個問題,將函子包裝到類中:


class MyClass {

    struct Less {

        Less(const MyClass& c) : myClass(c) {}

        bool operator () ( const int & i1, const int & i2 ) {// use 'myClass'} 

        MyClass& myClass;

    };

    doSort() { std::sort(arr,arr+someSize, Less(*this)); }

}



查看完整回答
反對 回復 2019-12-16
?
qq_花開花謝_0

TA貢獻1835條經驗 獲得超7個贊

正如Andreas Brinck所說,doCompare必須為靜態(+1)。如果您必須在比較器函數中使用狀態(使用該類的其他成員),則最好使用函子而不是函數(這樣會更快):


class MyClass{


   // ...

   struct doCompare

   { 

       doCompare( const MyClass& info ) : m_info(info) { } // only if you really need the object state

       const MyClass& m_info;


       bool operator()( const int & i1, const int & i2  )

       { 

            // comparison code using m_info

       }

   };


    doSort() 

    { std::sort( arr, arr+someSize, doCompare(*this) ); }

};

使用函子總是更好,鍵入的時間更長(這可能不方便,但是很好...)


我認為您也可以將std :: bind與成員函數一起使用,但是我不確定如何并且那也不容易閱讀。


今天,我們可以使用c ++ 11編譯器,因此您可以改用lambda,代碼雖然較短,但語義完全相同。



查看完整回答
反對 回復 2019-12-16
?
翻過高山走不出你

TA貢獻1875條經驗 獲得超3個贊

v

Rob提出的解決方案現在是有效的C ++ 11(無需Boost):


void doSort()

{

  using namespace std::placeholders;

  std::sort(arr, arr+someSize, std::bind(&MyClass::doCompare, this, _1, _2));

}

確實,正如Klaim所提到的,lambda是一個選項,有點冗長(您必須“重復”這些參數是整數):


void doSort()

{

  std::sort(arr, arr+someSize, [this](int l, int r) {return doCompare(l, r); });

}

C ++ 14 auto在這里支持:


void doSort()

{

  std::sort(arr, arr+someSize, [this](auto l, auto r) {return doCompare(l, r); });

}

但是,您仍然聲明參數是通過副本傳遞的。


那么問題是“哪一個是最有效的”。特拉維斯·高克爾(Travis Gockel)處理了該問題:Lambda vs Bind。他的基準測試程序在我的計算機上提供(OS X i7)


                        Clang 3.5    GCC 4.9

   lambda                    1001        7000

   bind                3716166405  2530142000

   bound lambda        2438421993  1700834000

   boost bind          2925777511  2529615000

   boost bound lambda  2420710412  1683458000

其中lambda的lambda直接使用,lambda bound是存儲在中的lambda std::function。


因此看來,lambda是更好的選擇,這并不奇怪,因為為編譯器提供了可從中獲利的更高級別的信息



查看完整回答
反對 回復 2019-12-16
  • 3 回答
  • 0 關注
  • 416 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號