重载<<对于迭代器的向量

时间:2016-07-10 19:13:52

标签: c++ vector

我目前正在尝试使用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();
}

我不熟悉重载函数,我仍然是向量的新手。所以任何有关这方面的帮助将不胜感激!

2 个答案:

答案 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;
}

一步一步:

  1. 通常最好将std::ostream&返回给来电者代码,以便将void operator<<更改为std::ostream& operator<<原型。
  2. operator<<你只需做你想做的事。如果输出中有pair个数据 - 请将其放在那里:

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