对迭代器向量的重载<<

overloading << for vector of pairs iterator

本文关键字:重载 迭代器 向量      更新时间:2023-10-16

我目前正在尝试使用find_if在对向量中查找元素。我尝试在谷歌上搜索如何重载<<运算符,它确实给了我大量关于如何重载<<的信息。它仍然让我困惑如何实现我的目标。下面是我正在使用的代码,我想在我的对 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();
}

我不精通重载函数,我对向量仍然很陌生。 因此,任何有关这方面的帮助将不胜感激!

您不需要在这里重载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的元素是微不足道的,因此在这里并非完全需要重载插入运算符。

问题的完整代码:

#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;
    }