вектор — перегрузка & lt; & lt; и определение потокового манипулятора переполнения стека

Я надеюсь, что кто-то может предложить некоторое понимание конкретной проблемы, которая у меня есть. Я пишу программу, которая принимает целые числа, сохраняет их в векторе и распечатывает их с разделителями-запятыми для чисел больше 999 -> 1000.

Мой вопрос … ну, два на самом деле, как я могу передать вектор в функцию, и во-вторых, если я хотел перегрузить << сделать все это за кулисами это было бы возможно?

глобальная функция из класса Comma:

template <class T>
string formatWithComma(T value){
stringstream ss;
locale commaLoc(locale(), new CommaNumPunc() );
ss.imbue(commaLoc);
ss << value;
return ss.str();

цикл в main () для отображения вектора:

for (vector<unsigned int>::iterator i = integers.begin(); i != integers.end(); ++i){
cout << formatWithComma(*i) << "  ";
}

0

Решение

Первый вопрос:

как я могу передать вектор в функцию

Просто передайте это напрямую. Например (предположим шаблон функции):

template <typename T>
void processVector(const vector<T>& vec );

Внутри main вы можете назвать это следующим образом:

processVector<unsigned int> (integers); //an example instantiation

Второй вопрос:

если бы я хотел перегрузить << сделать все это за кулисами это было бы возможно?

Да, конечно возможно. посмотрим как перегрузить << Оператор из этих ресурсов:
Перегрузка MSDN << оператор а также
Перегрузить << оператор WISC

и куча ресурсов от SO: Как правильно перегрузить << оператор

1

Другие решения

Передача вектора в функцию может быть сделана так:

void foo(std::vector<T> &vector);
void foo(const std::vector<T> &vector);

Обычно вы хотите передать (постоянную) ссылку, чтобы избежать копирования вектора.

2

По вопросам рекламы [email protected]