2009-06-01 4 views
1

Мне было задано домашнее задание написать программу на C++, но нам не разрешено использовать класс string. Тем не менее, нам разрешено использовать библиотеку iostream, в том числе stringstream. Я думал об использовании stringstream, где я бы использовал строку для построения моих классов, возврата из функций и т. Д.Использование stringstream вместо строки? - C++

Это звучит как хорошая идея для вас? Любые подводные камни, о которых я должен знать?

+2

Единственный способ получить материал из строкового потока - это преобразовать его в строку. – workmad3

+0

Этот вопрос трудно ответить, поскольку мы не знаем, в чем причина, по которой вам не разрешено использовать класс string. Была ли точка назначения найти умный способ использования другого стандартного класса вместо строки? Или вы должны были реализовать свой собственный класс строк? –

+0

Это задание о полиморфизме. Мы строим базу данных магазина, в которой хранится список продуктов и корзин для покупок. Они просто скупы, не позволяя нам использовать строки. Я думаю, они ожидают, что мы будем использовать char * или какой-либо другой способ хранения массива символов. Но мы вольны разобраться в других креативных решениях. – Meir

ответ

10

Вы также можете использовать вектор <char>. Это хорошая альтернатива струне. Как говорит Скотт Мейерс в его «Эффективное STL» книги:

В-третьих, рассмотрим с использованием вектора < полукокса > вместо строки, вектор реализации не могут быть подсчет ссылок, поэтому скрытый производительность многопоточной проблемы выходят . Конечно, вы поступиться фантазии функции члена струны, если вы перехода на вектор < символа >, но большинство из , что функциональность доступна алгоритмов STL в любом случае, так you're-не столько отказа от функциональности, как вы торгующий один синтаксис для другой.

Я думаю, что основные проблемы, которые могут возникнуть в результате использования stringstream, состоят в том, что он не является строго контейнером. Я не уверен, можно ли использовать алгоритмы и другие обычные STL-файлы с потоками.

0

Если ситуация представляет собой базу данных магазина без строк, вы можете просто использовать перечисление.

enum { 
    Prod1, 
    Prod2, 
    Prod3 
}; 

Это означает, что вы можете просто передать целые вокруг как идентификаторы, а затем просто имеют функцию печати с переключателем заявления.

void PrintProd(int product) { 
    switch(product) { 
     case Prod1: 
       cout << "Product 1" << endl; 
       break; 
     case Prod2: 
       cout << "Product 2" << endl; 
       break; 
    // etc. 
    } 
} 

Это позволяет обойти много неприятностей. Если вы не против иметь дело с кучей, вектор char *, выделяющий имена продуктов, с индексом id, который будет индексом в векторе, тоже будет работать.