C ++ строки без <string>и STL - PullRequest
       27

C ++ строки без <string>и STL

4 голосов
/ 18 сентября 2008

В прошлом я не очень часто использовал C ++, а в последнее время много работаю с C #, и я действительно изо всех сил пытаюсь вернуться к основам C ++ снова. Это особенно непросто, поскольку в рабочих заданиях нельзя использовать ни одну из наиболее удобных конструкций C ++, поэтому все строки должны быть символами *, и для списков STL не предусмотрено.

То, что я сейчас пытаюсь сделать, - это создать список строк, что бы не заняло у меня совсем никакого времени при использовании STL или в C #. В основном я хочу иметь такую ​​функцию, как:

char **registeredNames = new char*[numberOfNames];

Тогда

RegisterName(const * char const name, const int length)
{
    //loop to see if name already registered snipped
    if(notFound)
    {
        registeredNames[lastIndex++] = name;
    }

}

или, если это был C # ...

if(!registeredNames.Contains(name))
{
    registeredNames.Add(name);
}

и я понимаю, что это не работает. Я знаю, что константный характер переданных переменных (константный указатель и константная строка) делает это довольно трудным, но моя основная проблема в том, что я всегда избегал этой ситуации в прошлом, используя списки STL и т. Д., Поэтому я никогда пришлось обойти это!

Прошу прощения за публикацию такого тривиального вопроса, и любая помощь будет принята с благодарностью!

Приветствия

1018 * Xan *

Ответы [ 14 ]

0 голосов
/ 19 сентября 2008

Я использовал этот класс String в течение многих лет.

http://www.robertnz.net/string.htm

Обеспечивает практически все функции Строка STL, но реализована как истинный класс, а не как шаблон и не использует STL.

0 голосов
/ 18 сентября 2008

const правильность по-прежнему остается правильной независимо от того, используете ли вы STL или нет. Я полагаю, что вы ищете, чтобы сделать namedNames const char **, чтобы присвоение registeredNames[i] (то есть const char *) работало.

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

Более того, вы не должны думать о том, чтобы сохранить это в списке, учитывая, что вы выполняете над ним операцию, набор был бы лучше.

0 голосов
/ 18 сентября 2008

Все предложенные подходы верны, я хочу сказать, что если C # делает это привлекательно, скопируйте его, создайте свои собственные классы / интерфейсы, чтобы представить ту же абстракцию, то есть простой класс связанного списка с методами Contains и Add, используя Пример кода, предоставленный другими ответами, должен быть относительно простым.

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

0 голосов
/ 18 сентября 2008

Если вы не беспокоитесь о соглашениях и просто хотите выполнить свою работу, используйте realloc. Я делаю подобные вещи для списков все время, это выглядит примерно так:

T** list = 0;
unsigned int length = 0;

T* AddItem(T Item)
{
 list = realloc(list, sizeof(T)*(length+1));
 if(!list) return 0;
 list[length] = new T(Item);
 ++length;
 return list[length];
}

void CleanupList()
{
 for(unsigned int i = 0; i < length; ++i)
 {
  delete item[i];
 }
 free(list)
}

Вы можете сделать больше, например, только realloc каждый раз, когда размер списка удваивается, функции для удаления элементов из списка по индексу или проверки равенства, создания шаблонного класса для обработки списков и т. д. (у меня есть один, который я написал много лет назад и всегда использую сам ... но, к сожалению, Я на работе и не могу просто скопировать это здесь). Честно говоря, это, вероятно, не будет превосходить эквивалент STL, хотя оно может сравниться с его производительностью, если вы выполняете тонну работы или у вас особенно плохая реализация STL.

К сожалению, в C ++ отсутствует оператор обновления / изменения размера для замены realloc, что было бы очень полезно.

О, и извините, если мой код содержит ошибки, я просто вытащил его из памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...