Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ STL复制、配对、向量和插入器_C++_Oop_Vector_Stl_Operator Overloading - Fatal编程技术网

C++ STL复制、配对、向量和插入器

C++ STL复制、配对、向量和插入器,c++,oop,vector,stl,operator-overloading,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_iterat

我的意见如下:

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;
}
#包括
#包括
#包括
#包括
内部主(空){
std::向量v;
std::copy(std::istream_迭代器(std::cin)、std::istream_迭代器()、std::back_插入器(v));
用于(自动配对:v)

std::cout问题不在于
std::vector
,而是
std::istream\u迭代器
。原因是
std::pair
没有定义反序列化运算符

您仍然可以使用
std::vector
std::back\u insert\u迭代器
,但您需要定义自己的输入迭代器。一个读取成对值的迭代器


有些人可能建议您为您的配对定义
运算符>
,但这是一种不可靠的技术。这取决于在包含

之前定义的运算符。您可以通过代理对象复制它:

#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;
}
#包括
#包括
#包括
#包括
结构代理
{
friend auto operator>>(std::istream&is、代理和prox)->std::istream&
{
is>>std::get(prox.target);
is>>std::get(prox.target);
回报是;
}
运算符std::pair()常量{
回报目标;
}
std::配对目标;
};
内部主(空){
std::向量v;
std::copy(std::istream_迭代器(std::cin),
std::istream_迭代器(),
标准:背部插入器(v);
用于(自动配对:v)

std::您是否需要为
Oh@P0W定义自己的实现,所以迭代器的问题,而不是向量,我明白了!不,我在
std
名称空间中做/建议时有点犹豫。有更好的替代方案,可能需要更多的努力。啊,我明白了,+1!您能解释一下您的最后一段吗?@gsamaras-。您的代码我们不能这样做来添加新函数的定义。这是一个很好的答案。如果它表明我对应该重载的内容的印象是错误的(这是迭代器,而不是向量),我会接受它。这样接受的答案会很简洁。