2015-06-29 14 views
6

bana bu kodun neden çalıştığını söyleyebilir misiniz? replace_if algoritması tarafından kullanılan aşırı yüklü operatör() var. Ana işlevde, IsEqual sınıfının sabit nesnesini oluşturdum, böylece yalnızca sabit işlev üyesi kullanılmalıdır. Bir şekilde istikrar, çalışmıyor ve bu operatör denir.C++ bu ve sürekli nesne

#include <iostream> 
#include <vector> 
#include <algorithm> 

class IsEqual { 
    int value; 
public: 
    IsEqual(int v) : value(v) {} 
    bool operator()(const int &elem){ 
    this->value=6; 
    return elem == value; 
    } 
}; 

int main() 
{ 
    const IsEqual tst(2); 
    std::vector<int> vec = {3,2,1,4,3,7,8,6}; 
    std::replace_if(vec.begin(), vec.end(), tst, 5); 
    for (int i : vec) std::cout << i << " "; 
    std::cout<<std::endl; 
} 

sonucu: 3 2 1 4 3 7 8 5

+4

bak: Bir const nesneye atıfta olacağını beri const olmak operatörü gerektirir, çünkü bu bir derleyici hatasına neden olacaktır. cppreference.com/w/cpp/algorithm/replace) ve yükleme bağımsız değişkeninin nasıl bildirildiğini düşünün. –

cevap

11

std::replace_iftst nesnenin kendi kopyasını yapacaktır. const olarak kısıtlanması gerekli değildir.

Algoritmada orijinal nesneyi kullanmak isterseniz, bir std::reference_wrapper kullanabilirsiniz. // tr: [ `replace_if`] (http imzasıyla birlikte

std::replace_if(vec.begin(), vec.end(), std::ref(tst), 5);