оператор перегрузки << для контейнеров c ++ stl - PullRequest
2 голосов
/ 17 февраля 2012

Хотелось бы просто напечатать содержимое набора / вектора / карты, используя cout <<.Для конструкторов stl это не кажется таким сложным: если предположить, что << определено для T, << для контейнера может просто пройти по элементам и распечатать их с использованием ofstream <<. </p>

простой способ напечатать их, о которых я не знаю?

Если нет, есть ли простое решение?Я читал в некоторых местах, что расширение классов STL - плохая идея.Это так и почему?

как насчет определения чего-то вроде перегруженной функции печати?РЕДАКТИРОВАТЬ: Я ищу рекурсивную функцию, которая может обрабатывать контейнеры контейнеров ... Я согласен, что разные люди хотели бы разные форматы, но что-то переопределить лучше, чем ничего

Ответы [ 4 ]

3 голосов
/ 17 февраля 2012

Вероятно, самый простой способ вывести контейнер STL -

std::copy(cont.begin(), cont.end(),
          std::ostream_iterator<Type>(std::cout, " "));

, где Type - это тип элементов cont (например, если cont имеет тип std::vector<int>, то Type должно быть int).

Конечно, вместо std::cout вы можете использовать любой ostream.

2 голосов
/ 17 февраля 2012

Самый простой способ выбросить контейнер - это, вероятно, просто использовать std::copy().Например, я обычно использую что-то вроде этого:

template <typename C>
std::string format(C const& c) {
    std::ostringstream out;
    out << "[";
    if (!c.empty()) {
        std::copy(c.begin(), --c.end(),
            std::ostream_iterator<typename C::value_type>(out, ", "));
            out << c.back();
    }
    out << "]";
    return out.str();
}

Да, это не всегда работает, но работает для моих нужд.Это фактически показывает одну из проблем, почему в стандартной библиотеке нет вывода для контейнеров: существует много разных способов форматирования контейнеров.Что еще хуже, отформатированный вывод должен быть читаемым, где все становится по-настоящему весело.Все это выполнимо, но я не знаю о соответствующем предложении.

2 голосов
/ 17 февраля 2012

В C ++ 11 вы можете использовать диапазон for:

for (auto& i: container)  cout << i << "  ";
cout << endl;
0 голосов
/ 21 февраля 2012

Это не кажется таким сложным для разработчиков stl: если предположить, что << определено для T, << для контейнера может просто перебрать элементы и вывести их с помощью ofstream <<. </p>

Конечно, им не сложно. Однако спросите себя: имеет ли смысл формат вывода для каждого клиента? Стандартная библиотека о повторном использовании и универсальности. Соединение контейнеров с некоторыми произвольными правилами форматирования вывода делает их менее универсальными только для некоторых.

Поэтому рекомендуемое решение состоит в том, чтобы предоставить свой собственный operator<<(std::ostream &, T) и / или использовать другие общие алгоритмы, как, например, в, например, <algorithms>.

...