2016-12-12 7 views
0
std::vector<std::pair<Pos, int>> v; 
// sort and other stuff... 
std::ostream_iterator<std::vector<std::pair<Pos, int>>> out_it(std::cout, "\n"); 
std::copy(v.begin(), v.end(), out_it); // error 

В настоящее время изучает STL и пытается напечатать на консоли с помощью copy. У меня есть operator<< для отображения пар, должен ли я сделать один для отображения вектора? Или есть другой способ? Pos - это только класс, который я определил, он имеет частную строку-член.C++ отображает вектор пар с использованием копии

+0

C++ автоматически не понять, как взять произвольный класс и преобразовать его в строковое представление, которое можно сбрасывать на 'std :: cout'. Для этого вам нужно написать явный код. Обратите внимание, что это также относится к 'std :: pair', в дополнение к вашему собственному классу. –

+0

@SamVarshavchik Вы имеете в виду, что мне нужно будет перегрузить 'operator <<' для отображения 'std :: vector'? У меня есть перегрузка 'operator <<' для отображения 'std :: pair' – user3221454

+0

, почему параметр типа ostream_iterator - это вектор, а не тип члена вектора? Вы должны хранить несколько векторов для потока? и да, вам нужно определить поведение для типа, который вы хотите сериализовать. – Swift

ответ

1

Это будет работать:

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

namespace std { 
template <class T1, class T2> 
    std::ostream& operator<<(std::ostream& out, const std::pair< T1, T2>& rhs) 
    { 
     out << "first: " << rhs.first << " second: " << rhs.second; 
     return out; 
    } 
} 

int main(){ 
    std::pair< size_t, int > pp(1,2); 
    std::vector<std::pair< size_t, int >> v; 
    v.push_back(pp); 
    v.push_back(pp); 
    v.push_back(pp); 

    std::ostream_iterator<std::pair< size_t, int >> out_it(std::cout, "\n"); 
    std::copy(v.begin(), v.end(), out_it); 
} 

зЬй :: копию() перебирает от значения, заданного первым параметром ко второму, используя третий параметр в качестве итератора для назначения. Очевидно, что типы должны совпадать.

Если определить итератор для потока векторов вам не нужно зЬй :: скопировать для вывода одного вектора (Это должен быть код для оператора < <?)