2013-02-21 85 views
1

我創建了一個包含有關變量,即他們的姓名和電話號碼C++:矢量容器和<algorithm>的std ::發現

struct var{ 
    string name; 
    int value; 
}; 

現在,我想用迭代器來更新它,使用下面的函數信息的結構:

void updateVariable(vector<Variable>& vars,Variable& newVar){ 
    vector<Variable>::iterator it = find(vars.begin(), vars.end(), newVar); 

    if(it == vars.end()){ 
     vars.push_back(newVar); 
    } 
    else{ 
     *it = newVar; 
    } 
} 

只是可以肯定的是,我得到的錯誤是在調用find()的行。任何想法,爲什麼我得到錯誤?以下是錯誤:

/usr/include/c++/4.6/bits/stl_algo.h:162:4: error: no match for ‘operator==’ in ‘__first.__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator* [with _Iterator = Variable*, _Container = std::vector<Variable>, __gnu_cxx::__normal_iterator<_Iterator, _Container>::reference = Variable&]() == __val’ 

更新:

謝謝你們所有的快速幫助,以及明確的答案!

+0

你可以使用std :: pair只有兩個值或元組(我認爲)從C + + 11多個值。那些已經爲您定義的比較和平等操作。 – 2013-02-21 18:39:31

+0

您應該使用已排序的向量和'std :: binary_search'。 – 2013-02-21 18:46:34

回答

7

您還沒有爲您的var結構定義operator ==。默認情況下,find()算法將使用operator ==將您提供的值與指定範圍內的值進行比較,並將迭代器返回到比較相等的第一個元素。

要解決這個問題,只需爲您的班級重載operator ==。要做到這一點的方法之一是這樣的:

struct var 
{ 
    string name; 
    int value; 
}; 

bool operator == (var const& v1, var const& v2) 
{ 
    return (v1.name == v2.name) && (v1.value == v2.value); 
} 

確保在同一個命名空間爲您的var結構定義operator ==,否則ADL(參數依賴查找)將失敗,你可能會得到一個編譯錯誤。

如果您正在使用C++ 11的工作,你不希望打擾界定operator ==重載版本,你甚至可以用find_if()並傳遞一個lambda作爲最後一個參數:

find_if(vars.begin(), vars.end(), [&] (var const& v) { 
    return (v.name == newVar.name) && (v.value == newVar.value); 
    }); 

由於GManNickG正確地指出的,當你需要幾個成員相比,使用std::tie和重載operator ==std::tuple可以爲您節省一些打字:

auto const tieMembers = [] (const var&) { 
    return std::tie(v.name, v.value, ...); 
    }; 

比較值v1var類型的v2當上面的λ然後,可以使用這種方式:

return (tieMembers(v1) == tieMembers(v2)); 
+0

也許有用的要注意的是,如果你想比較幾個成員,你可以重用'std :: tuple'的相等運算符,就像這樣:'bool operator ==(const var&v1,const var&v2){const auto tieMembers = [](const var&v){return std :: tie(v.member1,v.member2,/ * ... * /); };返回tieMembers(v1)== tieMembers(v2); }'。 – GManNickG 2013-02-21 19:29:47

+0

@GManNickG:非常好。編輯 – 2013-02-21 19:34:44

2

需要定義的operator==過載爲var。這應該工作。

bool operator==(const var& a, const var& b){ 
    return (a.name == b.name) && (a.value == b.value); 
} 
相關問題