STL复制,对,矢量和插入器

时间:2017-10-23 06:37:39

标签: c++ oop vector stl operator-overloading

我有一个输入:

1 a
2 b
..

我想将它们插入到具有复制功能的对矢量中,如下所示:

#include <vector>
#include <iterator>
#include <algorithm>
#include <iostream>

int main(void) {
    std::vector<std::pair<int, char>> v;
    std::copy(std::istream_iterator<std::pair<int, char>>(std::cin), std::istream_iterator<std::pair<int, char>>(), std::back_inserter(v));
    for(auto pair: v)
        std::cout << pair.first << std::endl;
    return 0;
}

但是,这不会编译:{{1​​}},因为它可能需要运算符重载。

这是否意味着我必须创建自己的类,它来自error: no match for 'operator>>',然后重载运算符?

我想避免使用我自己的类,而不是标准的矢量类。

2 个答案:

答案 0 :(得分:2)

问题不在于std::vector,而在std::istream_iterator。原因是std::pair没有定义反序列化运算符。

您仍然可以使用std::vectorstd::back_insert_iterator,但您需要定义自己的输入迭代器。一个读取价值对的人。

有些人可能会建议你为你的对定义operator>>,但这是一种不可靠的技术。在您加入<algorithm><iterator>之前,它将取决于所定义的运算符。

答案 1 :(得分:1)

您可以通过代理对象复制它:

#include <vector>
#include <iterator>
#include <algorithm>
#include <iostream>

struct proxy
{
    friend auto operator>>(std::istream& is, proxy& prox) -> std::istream&
    {
        is >> std::get<0>(prox.target);
        is >> std::get<1>(prox.target);
        return is;
    }

    operator std::pair<int, char>() const {
        return target;
    }

    std::pair<int, char> target;
};

int main(void) {
    std::vector<std::pair<int, char>> v;
    std::copy(std::istream_iterator<proxy>(std::cin), 
              std::istream_iterator<proxy>(), 
              std::back_inserter(v));
    for(auto pair: v)
        std::cout << pair.first << std::endl;
    return 0;
}