我目前正在尝试使用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;
}
我试过重载&lt;&lt;像这样的运营商。
template <typename T, typename D>
void operator<<(ostream& os, vector<pair(typename T, typename D)> &lst)
{
cout << lst.begin.front();
}
我不熟悉重载函数,我仍然是向量的新手。所以任何有关这方面的帮助将不胜感激!
答案 0 :(得分:0)
此处operator<<
不需要重载std::vector<std::pair>
,因为std::find_if
会返回指向std::vector
中找到的元素的迭代器,在这种情况下将会成为std::pair<std::string, HWND>
的迭代器,通过您可以使用的std::ostream
进行打印,
template<typename _Ty1, typename _Ty2>
std::ostream& operator<<(std::ostream& _os, const std::pair<_Ty1, _Ty2>& _p) {
_os << _p.first << ' ' << _p.second;
return _os;
}
如果你想沿着operator<<
超载路线走下去。但是,std::pair
的打印元素无论如何都是微不足道的,因此这里不一定需要重载插入操作符。
答案 1 :(得分: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;
}
一步一步:
std::ostream&
返回给来电者代码,以便将void operator<<
更改为std::ostream& operator<<
原型。在operator<<
你只需做你想做的事。如果输出中有pair
个数据 - 请将其放在那里:
for (const auto &p : lst) {
os << p.first << ", " << p.second;
}