我有一个输入:
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>>'
,然后重载运算符?
我想避免使用我自己的类,而不是标准的矢量类。
答案 0 :(得分:2)
问题不在于std::vector
,而在std::istream_iterator
。原因是std::pair
没有定义反序列化运算符。
您仍然可以使用std::vector
和std::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;
}