Как мога да отпечатам красиво std::vector
? Например, ако конструирам std::vector<int>(6, 1)
, през какво мога да го прокарам, за да получа резултат като {1 1 1 1 1 1}
в C++? Трябва да е общ, тъй като размерът и стойността може да се променят, така че std::vector<int>(4, 0)
ще бъде {0 0 0 0}
.
Красиво отпечатване на std::vector в C++
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
Обърнете внимание, че това няма да произведе изхода, поискан от OP, защото ще има краен разделител:
{0 0 0 0 }
(ако това има значение).
- person Björn Pollex; 15.03.2013
Вероятно правописна грешка/пропуснато от C&P'ing, но ако шаблонирате своя оператор за произволен
T
, не искате ostream_iterator<int>
.
- person us2012; 15.03.2013
@us2012: правилно, коригирано.
- person Matteo Italia; 15.03.2013
@BjörnPollex: прав си, по някаква причина винаги мисля, че
ostream_iterator
се грижи за това. Е, просто ще добавя интервал в началото, за да стане симетрично. :)
- person Matteo Italia; 15.03.2013
@MatteoItalia: Това е причината, поради която използвам това само с интервал или нов ред като разделител, защото е практически безполезно за нищо друго. От друга страна, добавяте проверка дали векторът не е празен и след това просто копирате до
--vec.end()
и отпечатвате последния елемент в допълнителна стъпка.
- person Björn Pollex; 15.03.2013
Имам проблем, че понякога стойността std::vector‹int›(4,0) се съхранява в низ по някаква причина. като str = std::vector‹int›(4,0) и се показва в базата данни така, както е. Но бих искал да го покажа като {0 0 0 0} Възможно ли е да се направи някакво преобразуване на типа за тези случаи??
- person dharag; 16.03.2013
@user2029504: не можете да оцените този вид израз по време на изпълнение в C++; ако наистина имате нужда от такова нещо, можете да напишете някакъв вид ad-hoc анализатор, но най-доброто решение е просто да съхраните вектора в някакъв фиксиран, лесно анализируем формат (като този, за който говорим тук).
- person Matteo Italia; 16.03.2013
#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
Това върши работа, но не изглежда много добре. Също така, как да го публикувам тук, така че да е по-четлив. съжалявам
- person dharag; 18.03.2013
@user2029504: създайте друг въпрос за този нов проблем.
- person Matteo Italia; 18.03.2013
Работи с back() вместо last(). Вече предложих редакцията.
- person hsandt; 18.10.2017
@hsandt: благодаря, одобрено!
- person Matteo Italia; 18.10.2017