LINUX.ORG.RU

C++ итераторы: признак конца последовательности


0

2

Пишу функцию, принимающую строковый итератор, в функции нужно пройтись по всем элементам начиная с указанного до конца. Как определить этот конец при условии, что сама последовательность в функции недоступна, а передавать дополнительный параметр string.end() - не хочется? Попробовал так - работает:

void foo(std::string::const_iterator i){
 for(i;*i!=0;i++)
  printf("%c",*i);
 printf("\n");}

Но я не уверен, есть ли гарантия, что std::string обязана хранить завершающий 0.

★★★★★

передавай range итераторов, это стандартная практика в stl

anonymous
()
Ответ на: комментарий от staseg

Если использовать строку по назначению, а не как byte array, нуля в середине не будет.

А как же юникод?

Хотя я использую std::basic_string<unsigned int> для его хранения, но в std::string частенько конвертирую. Нули встречаются.

note173 ★★★★★
()
Ответ на: комментарий от note173

Да, как уже тут сказали, end нужно передавать всегда, — это стандартная практика в stl. Есть другие способы передать диапазон коллекции в функцию.

note173 ★★★★★
()
Ответ на: комментарий от namezys

неа, формально только в c++03 прописали

Reset ★★★★★
()
Ответ на: комментарий от namezys

а с чего бы это ему возвращать что-то другое?

Reset ★★★★★
()
Ответ на: комментарий от staseg

Если использовать строку по назначению, а не как byte array, нуля в середине не будет.

std::string это и есть byte-array и в куче библиотек она используется именно так

Reset ★★★★★
()
void foo(std::string::const_iterator i)

а так никто не делает, делают так:

template<typename It>
void foo(It begin, It end)

и всё тип топ

shty ★★★★★
()
Ответ на: комментарий от dave

Чем приятно троллить на тему лиспа или скалы - там детей меньше :)

dave ★★★★★
()
Ответ на: комментарий от Reset

Ну, если тебе перспектива использовать wchar_t/нёх для хранения «байта» не кажется ССЗБством, то я умываю руки.

LamerOk ★★★★★
()
Ответ на: комментарий от shty

а так никто не делает, делают так:

template<typename It>
void foo(It begin, It end)

и всё тип топ

И весь код перемещаем в header, а при каждом изменении в коде пересобираются все единицы трансляции прямо или косвенно включающие этот header? Это называется «тип топ»?

kamre ★★★
()
void foo( char* s ){
 for( ; *s ; ++s )
  printf("%c",*s);
 printf("\n");}

строка она и есть строка

anonymous
()
Ответ на: комментарий от Reset

Речь идет об std::string, а он содержит конкретный тип (char).

Т.е. ты просто не понял того, что я тебе написал? Так и скажи.

LamerOk ★★★★★
()
Ответ на: комментарий от JackyTreehorn

Мож сразу лямбду присобачить? :)

да всё можно, но суть не в этом же :)

shty ★★★★★
()
Ответ на: комментарий от shty

> И весь код перемещаем в header

зачем?

Раньше была обычная функция и прототип был в h, а реализация - в cpp. Стала шаблонной, для шаблонов нет раздельной компиляции, скрыть реализацию от всех кому нужно вызывать эту функцию уже нельзя.

kamre ★★★
()
Ответ на: комментарий от kamre

Раньше была обычная функция и прототип был в h, а реализация - в cpp. Стала шаблонной, для шаблонов нет раздельной компиляции, скрыть реализацию от всех кому нужно вызывать эту функцию уже нельзя.

Религия запрещает поместить шаблонный класс, нужный только одной функции из .cpp, в этот же файл рядом с определением функции?

schizoid ★★★
()
Ответ на: комментарий от schizoid

шаблонный класс, нужный только одной функции из .cpp

Откуда такое предположение? Исходная функция могла использоваться в нескольких единицах трансляции, а после перехода на шаблонные итераторы всю ее реализацию нужно выносить в header.

kamre ★★★
()
Ответ на: комментарий от kamre

Раньше была обычная функция и прототип был в h, а реализация - в cpp.

нет, правда?

shty ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.