Как я могу красиво напечатать 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 user2029504: вы не можете оценить такое выражение во время выполнения на C++; если вам действительно нужна такая вещь, вы можете написать какой-нибудь специальный анализатор, но лучшее решение — просто сохранить вектор в каком-то фиксированном, легко анализируемом формате (например, тот, о котором мы говорим здесь).
- person Matteo Italia; 16.03.2013
#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
Это работает, но выглядит не очень красиво. Кроме того, как мне опубликовать его здесь, чтобы его было более читабельно. Прости
- 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