【问题标题】:STL copy, pair, vector and inserterSTL 复制、配对、向量和插入器
【发布时间】:2017-10-23 06:37:39
【问题描述】:

我有一个输入:

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

但是,这不会编译:error: no match for 'operator&gt;&gt;',因为它可能需要运算符重载。

这是否意味着我必须创建自己的类,继承自 std::vector,然后重载运算符?

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

【问题讨论】:

  • 你需要为&lt;&lt;定义你自己的实现来读取一对like this may be
  • 哦@P0W,我明白了迭代器的问题,而不是向量的问题!
  • 不,我在 std 命名空间中做/建议有点犹豫。有更好的选择,可能需要更多的努力。

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


【解决方案1】:

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

您仍然可以使用std::vector 和std::back_insert_iterator,但您需要定义自己的输入迭代器。读取成对的值。

有些人可能会建议您为您的配对定义operator&gt;&gt;,但这是一种不可靠的技术。这将取决于在包含 &lt;algorithm&gt; 和 &lt;iterator&gt; 之前定义的运算符。

【讨论】:

  • 啊,我明白了,+1!你能解释一下你的最后一段吗?
  • @gsamaras - This is why。您在帖子评论中提供的代码会重新打开命名空间标准。我们不能这样做来添加新函数的定义。这是UB。
【解决方案2】:

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

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

【讨论】:

  • 不错的答案。如果它表明我对应该重载的内容的印象是错误的(它是迭代器,而不是向量),我会接受它。这样接受的答案就会很紧凑。
猜你喜欢
  • 2012-01-05
  • 2013-01-26
  • 1970-01-01
  • 2021-09-03
  • 2011-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多