2016-07-10 64 views
0

我目前正在嘗試使用find_if來查找向量對中的元素。我嘗試過在google上搜索如何重載< <運算符,它確實爲我提供了大量信息關於如何超載< <。它仍然讓我困惑如何實現我的目標。下面是我使用的代碼,我想找到提供給我的向量對s的函數的字符串。重載<<爲成對向量的迭代器

void Utils::findIt(string serchVal) 
{ 
    vector<pair<string, HWND>>::iterator it = find_if(s.begin(), s.end(), 
[&serchVal](const pair<string, HWND>& element) { return element.first == serchVal; }); 

    cout << "find function found : " << *it << endl; 

} 

我已經嘗試過載< <運營商這樣的。

template <typename T, typename D> 
void operator<<(ostream& os, vector<pair(typename T, typename D)> &lst) 
{ 
    cout << lst.begin.front(); 
} 

我不是很精通重載函數,我仍然是新的向量。所以任何有關這方面的幫助將不勝感激!

+0

我找到[這](http://www.tutorialspoint.com/cplusplus/cpp_overloading.htm)非常有用。您應該返回對流的引用。在超載內部,您應該將某些東西放入流中。 'lst.begin.front();'是一個noop,你期望它做什麼?一般來說,當您需要幫助修復某些代碼時,您應該發佈錯誤消息(如果有),期望的和實際的行爲。 – user463035818

+1

除了可能用於輸出結果之外的其他內容 - 重載'operator <<()'與查找字符串有關嗎?我問的原因是你的問題是混淆 - 找到一個字符串和輸出某些東西的無關概念在某種程度上被結合在一起。 – Peter

回答

0

你並不需要重載operator<<std::vector<std::pair>這裏std::find_if將返回迭代器,指向在std::vector,在這種情況下將是一個迭代的std::pair<std::string, HWND>,通過std::ostream你可以把它打印出來發現元素如果你想下去operator<<超載航線使用,

template<typename _Ty1, typename _Ty2> 
std::ostream& operator<<(std::ostream& _os, const std::pair<_Ty1, _Ty2>& _p) { 
    _os << _p.first << ' ' << _p.second; 
    return _os; 
} 

。但是,std::pair的打印元素無論如何都是微不足道的,因此重載插入操作符在這裏並不是完全必要的。

+0

與此我只得到錯誤「二進制'<<':找不到操作符,它需要類型'std :: pair '(或沒有可接受的轉換)」的右側操作數「我也想通過任何其他方式來解決這個問題的建議 – jake

+0

@mike我沒有做太多的Windows API編程,但我只能假設'HWND'沒有重載的'operator <<',你必須提供你自己的(如果它在這種情況下甚至是有意義的)。如果你只想打印'std :: pair'的std :: string,那麼就用'std :: cout <<(* it).first'來代替你的問題中的語句。 – ArchbishopOfBanterbury

0

有關問題的完整代碼:

#include <iostream> 
#include <vector> 
#include <utility> 

template <typename T, typename D> 
std::ostream& operator<<(std::ostream& os, std::vector<std::pair<T, D>> &lst) { 
    for (const auto &p : lst) { 
     os << p.first << ", " << p.second; 
    } 
    return os; 
} 

int main() { 
    std::vector<std::pair<int, int>> pairs = { { 1, 2 }, { 5, 6 } }; 
    std::cout << pairs << std::endl; 
    return 0; 
} 

一步一步:

  1. 通常最好是回到std::ostream&回調用者的代碼,所以我們改變你的void operator<<std::ostream& operator<<原型。
  2. operator<<你只是做你想做的。如果您pair的輸出數據 - 把它放在那裏:

    for (const auto &p : lst) { 
        os << p.first << ", " << p.second; 
    }