Красиво напечатать std::vector в C++

Как я могу красиво напечатать std::vector? Например, если я создам std::vector<int>(6, 1), через что я могу его запустить, чтобы получить вывод, подобный {1 1 1 1 1 1} в C++? Он должен быть общим, так как размер и значение могут измениться, поэтому std::vector<int>(4, 0) будет {0 0 0 0}.


person dharag    schedule 15.03.2013    source источник
comment
что ты имеешь в виду? вы хотели бы просто распечатать элементы вектора в определенном форматировании?   -  person taocp    schedule 15.03.2013
comment
использовать поток для их печати?   -  person spiritwolfform    schedule 15.03.2013
comment
Отображать на экране консоли? У вас есть какой-нибудь код?   -  person Emmanuel N    schedule 15.03.2013
comment
Да печатать элементы в определенном формате на экране консоли. Мне просто нужна идея, как это сделать, возможно, я сам смогу написать код.   -  person dharag    schedule 15.03.2013
comment
Я рассмотрю возможный дублирующий ответ. Извиняюсь за дублирование.   -  person dharag    schedule 15.03.2013


Ответы (1)


#include <vector>
#include <algorithm>
#include <iterator>

template<typename T>
std::ostream & operator<<(std::ostream & os, std::vector<T> vec)
{
    os<<"{ ";
    std::copy(vec.begin(), vec.end(), std::ostream_iterator<T>(os, " "));
    os<<"}";
    return os;
}

затем вы можете вывести свои векторы с обычным синтаксисом operator<<:

std::cout<<yourVector;

вы можете увидеть это в действии здесь.

Но для более гибких решений взгляните на вопрос, указанный выше.


Изменить: если вам не нужны два пробела (в начале и в конце):

template<typename T>
std::ostream & operator<<(std::ostream & os, std::vector<T> vec)
{
    os<<"{";
    if(vec.size()!=0)
    {
        std::copy(vec.begin(), vec.end()-1, std::ostream_iterator<T>(os, " "));
        os<<vec.back();
    }
    os<<"}";
    return os;
}
person Matteo Italia    schedule 15.03.2013
comment
Обратите внимание, что это не приведет к выводу, запрошенному OP, потому что он будет иметь завершающий разделитель: {0 0 0 0 } (если это имеет значение). - person Björn Pollex; 15.03.2013
comment
Вероятно, опечатка/пропущена C&P'ing, но если вы шаблонируете свой оператор для произвольного T, вам не нужен ostream_iterator<int>. - person us2012; 15.03.2013
comment
@us2012: правильно, исправлено. - person Matteo Italia; 15.03.2013
comment
@BjörnPollex: ты прав, я почему-то всегда думаю, что ostream_iterator позаботится об этом. Ну, я просто добавлю пробел в начале, чтобы сделать его симметричным. :) - person Matteo Italia; 15.03.2013
comment
@MatteoItalia: Это причина, по которой я использую это только с пробелом или новой строкой в ​​качестве разделителя, потому что это практически бесполезно для чего-либо еще. С другой стороны, вы добавляете проверку, не пуст ли вектор, а затем просто копируете до --vec.end() и печатаете последний элемент на дополнительном шаге. - person Björn Pollex; 15.03.2013
comment
У меня проблема, что иногда значение std::vector‹int›(4,0) по какой-то причине сохраняется в строке. как str = std::vector‹int›(4,0) и отображается в базе данных как есть. Но я хотел бы отобразить его как {0 0 0 0} Можно ли сделать какое-то преобразование типов для этих случаев?? - person dharag; 16.03.2013
comment
@user2029504 user2029504: вы не можете оценить такое выражение во время выполнения на C++; если вам действительно нужна такая вещь, вы можете написать какой-нибудь специальный анализатор, но лучшее решение — просто сохранить вектор в каком-то фиксированном, легко анализируемом формате (например, тот, о котором мы говорим здесь). - person Matteo Italia; 16.03.2013
comment
#include ‹iostream› с использованием пространства имен std; int main() { string str = std::vector‹int›(6,0) ; найдено без знака = str.find('('); char c = str[Найдено+1]; int i = c - '0'; char ch = str[Найдено+3]; int j = ch - '0'; str = { ; for(int k = 0; k ‹ i ; k++) { str = str + ch + ; } str = str + }; cout ‹‹ str ‹‹ endl; return 0; } - person dharag; 18.03.2013
comment
Это работает, но выглядит не очень красиво. Кроме того, как мне опубликовать его здесь, чтобы его было более читабельно. Прости - person dharag; 18.03.2013
comment
@ user2029504: создайте еще один вопрос для этой новой проблемы. - person Matteo Italia; 18.03.2013
comment
Работает с back() вместо last(). Я уже предложил редактирование. - person hsandt; 18.10.2017
comment
@hsandt: спасибо, одобрено! - person Matteo Italia; 18.10.2017