Перегрузка << для vector c++
Есть такой ассоциативный массив: map<char, vector<bool> > table;
Как перегрузить << для cout, чтоб я мог выводить такую конструкцию:
for (map<char, vector<bool> >::iterator itr = table.begin(); itr != table.end(); ++itr)
{
cout << itr->first << " : " << itr->second << endl;
}
Ответы (2 шт):
Вам нужно просто дописать оператор
ostream& operator<<(ostream& stream, const vector<bool>& vec);
Как именно должен работать этот оператор - зависит от того, что вы хотите получить. В простейшем варианте
ostream& operator<<(ostream& stream, const vector<bool>& vec) {
for(auto b: vec) stream << b;
return stream;
}
Правильный ответ — никак.
Перегруженные операторы обязательно нужно располагать в том месте, где их найдет argument-dependent lookup. Очень грубо говоря, это значит "в том же namespace, где объявлен класс (или его шаблонные аргументы)", в вашем случае это означает — в namespace std.
В namespace std нельзя добавлять свои функции, поэтому лучше отказаться от идеи с перегрузкой.
Или, если очень хочется, завернуть вектор в структуру и перегрузить оператор для структуры (в том неймспейсе, где вы ее объявите).
Вот что будет, если проигнорировать этот принцип, и положить оператор, например, в глобальный неймспейс:
Вот такой код работает.
#include <iostream>
#include <vector>
std::ostream &operator<<(std::ostream& stream, const std::vector<bool> &vec)
{
for (const auto &b : vec)
stream << b;
return stream;
}
namespace A
{
void foo()
{
std::vector<bool> vec = {1,0,1,1};
std::cout << vec << '\n';
}
}
А вот такой уже не работает, хотя мы просто добавили еще один operator<<, не связанный с std::vector<bool>.
#include <iostream>
#include <vector>
std::ostream &operator<<(std::ostream& stream, const std::vector<bool> &vec)
{
for (const auto &b : vec)
stream << b;
return stream;
}
namespace A
{
struct B {};
std::ostream &operator<<(std::ostream& stream, B)
{
return stream;
}
void foo()
{
std::vector<bool> vec = {1,0,1,1};
std::cout << vec << '\n';
}
}