Печать списков с запятыми C ++ - PullRequest
46 голосов
/ 17 августа 2010

Я знаю, как это сделать на других языках, кроме C ++, который я вынужден использовать здесь.

У меня есть набор строк, которые я печатаю в списке, и между ними нужна запятая, а не запятая. В java, например, я бы использовал stringbuilder и просто удалял запятую с конца после того, как собрал свою строку. Как мне это сделать в C ++?

auto iter = keywords.begin();
for (iter; iter != keywords.end( ); iter++ )
{

    out << *iter << ", ";
}
out << endl;

Сначала я попытался вставить этот блок, чтобы сделать это (перемещая печать запятой здесь)

if (iter++ != keywords.end())
    out << ", ";
iter--;

Ненавижу, когда мелочи сбивают меня с толку.

РЕДАКТИРОВАТЬ: Спасибо всем. Вот почему я размещаю подобные вещи здесь. Так много хороших ответов, и решаются по-разному. После семестра Java и ассемблера (разные классы) необходимость выполнения C ++ проекта за 4 дня заставила меня задуматься. Мало того, что я получил свой ответ, я получил возможность подумать о различных способах решения такой проблемы. Потрясающе.

Ответы [ 24 ]

0 голосов
/ 17 августа 2010

Вы можете использовать цикл do, переписать условие цикла для первой итерации и использовать оператор короткого замыкания && и тот факт, что допустимый поток равен true.

auto iter = keywords.begin();
if ( ! keywords.empty() ) do {
    out << * iter;
} while ( ++ iter != keywords.end() && out << ", " );
out << endl;
0 голосов
/ 18 февраля 2014

Этот перегружает оператора потока. Да, глобальные переменные - зло.

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <iterator>

int index = 0;
template<typename T, template <typename, typename> class Cont>
std::ostream& operator<<(std::ostream& os, const Cont<T, std::allocator<T>>& vec)
{
    if (index < vec.size()) {
        if (index + 1 < vec.size())
            return os << vec[index++] << "-" << vec;
        else
            return os << vec[index++] << vec;
    } else return os;
}

int main()
{
    std::vector<int> nums(10);
    int n{0};
    std::generate(nums.begin(), nums.end(), [&]{ return n++; });
    std::cout << nums << std::endl;
}
0 голосов
/ 22 июля 2013

Другое возможное решение, которое позволяет избежать if

Char comma = '[';
for (const auto& element : elements) {
    std::cout.put(comma) << element;
    comma = ',';
}
std::cout.put(']');

Зависит от того, что вы делаете в цикле.

0 голосов
/ 17 августа 2010

Я бы выбрал что-то вроде этого, простое решение и должно работать для всех итераторов.

int maxele = maxele = v.size() - 1;
for ( cur = v.begin() , i = 0; i < maxele ; ++i)
{
    std::cout << *cur++ << " , ";
}
if ( maxele >= 0 )
{
  std::cout << *cur << std::endl;
}
...