Красиво отпечатване на 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: не можете да оцените този вид израз по време на изпълнение в C++; ако наистина имате нужда от такова нещо, можете да напишете някакъв вид ad-hoc анализатор, но най-доброто решение е просто да съхраните вектора в някакъв фиксиран, лесно анализируем формат (като този, за който говорим тук). - person Matteo Italia; 16.03.2013
comment
#include ‹iostream› using namespace std; int main() { string str = std::vector‹int›(6,0) ; unsigned found = str.find('('); char c = str[found+1]; int i = c - '0'; char ch = str[found+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