Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.192] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 390 391 [392] 393 394 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#5866
,
|
|
|
|
D_KEY, а где возгласы про то, что std::string работает оптимальнее массива ? Я их уже чего то не вижу. Вы ведь сначало именно на это делали акцент. Мол де, std::string работает со своим внутренним буфером, который оптимальнее для строк, и может представлять собой сущность отличную от массива, на деле - это самый обыкновенный std::vector, с некоторыми примочками, и не более.
|
|
Сообщ.
#5867
,
|
|
|
|
Цитата KILLER @ Цитата D_KEY @ И что? Логика работы стандартных С++ строк не зависит от 0-символа. Он обрабатывается точно так же, как и любой другой. То, что std::string в большинстве реализаций представляет собой обыкновенный массив, такой же как и вектор, ничуть не лучше и не хуже. Да причем тут это? Этого не достаточно для правильной логики работы со строками. Даже если можно было бы передать std::string на запись в С-апи, это только нарушит логику работы строки. Тот же твой trim впендюрит \0 в нужную позицию и все. Для С-строк этого достаточно, для std::string - нет, т.к. он не наделяет '\0' каким-то особым смыслом. Ты хочешь изменения логики работы этого класса так, чтобы он работал именно с null-terminated строками, а это бред. |
|
Сообщ.
#5868
,
|
|
|
|
Ниче страшного, вроде понятно там все memcpy - также работает с массивами данных. в нашем случае массив char'ов. Но зато, ты предлаегаешь мне создавать временный вектор, вместо использования уже существующего массива.. Да хоть бы отдавал указатель, через какой нить новый метод release. Кому нужно - юзает, кому не нужно, пусть не юзает. Проблемы то собственно и нет... |
|
Сообщ.
#5869
,
|
|
|
|
Цитата KILLER @ D_KEY, а где возгласы про то, что std::string работает оптимальнее массива ? Я их уже чего то не вижу. Вы ведь сначало именно на это делали акцент. Я вообще ничего подобного не говорил. Добавлено KILLER, С-строки это не просто массив. Ключевой особенностью null-terminated string является наличие специального символа-терминатора, на котором строится вся логика работы со строками. Даже если std::string всегда хранит линейный буфер памяти, как и вектор(по новому стандарту вроде так и есть), это не делает std::string null-terminated строками. |
|
Сообщ.
#5870
,
|
|
|
|
Цитата D_KEY @ Даже если можно было бы передать std::string на запись в С-апи, это только нарушит логику работы строки. Тот же твой trim впендюрит \0 в нужную позицию и все. Для С-строк этого достаточно, для std::string - нет, т.к. он не наделяет '\0' каким-то особым смыслом. ![]() ![]() std::string str(" blabla bala "); char* pStr = str.release(); //! вернули указатель на char, и обнулили внутрение буфера размеры и т.д. trim(pStr); //! далее либо работай с указателем, после чего вызывай delete pStr; Либо обратно передавай в свою строку: str.assign(pStr); //! PROFIT!!! Добавлено Цитата D_KEY @ KILLER, С-строки это не просто массив. Ключевой особенностью null-terminated string является наличие специального символа-терминатора, на котором строится вся логика работы со строками. Даже если std::string всегда хранит линейный буфер памяти, как и вектор(по новому стандарту вроде так и есть), это не делает std::string null-terminated строками. Зато я спокойно без лишних компирований могу его таким какой он мне нужен сделать. |
|
Сообщ.
#5871
,
|
|
|
|
Цитата KILLER @ memcpy - также работает с массивами данных. в нашем случае массив char'ов. Но зато, ты предлаегаешь мне создавать временный вектор, вместо использования уже существующего массива.. Да хоть бы отдавал указатель, через какой нить новый метод release. Кому нужно - юзает, кому не нужно, пусть не юзает. Проблемы то собственно и нет... Да ты никак не понимаешь, что дело не столько в том, массив там или нет, сколько в том, что работать с буфером std::string строки, как с С-строкой - не правильно. std::string - это не null-terminated строка, даже если это массив. Добавлено Цитата KILLER @ ![]() ![]() std::string str(" blabla bala "); char* pStr = str.release(); //! вернули указатель на char, и обнулили внутрение буфера размеры и т.д. trim(pStr); //! далее либо работай с указателем, после чего вызывай delete pStr; Либо обратно передавай в свою строку: str.assign(pStr); //! PROFIT!!! А теперь подумай об аллокаторах, например. Хотя такой специальный класс может и был бы полезен. Но не в качестве обычной строки. Цитата Зато я спокойно без лишних компирований могу его таким какой он мне нужен сделать. Нарушая абстракцию и инкапсуляцию? Потрясающе. Добавлено Цитата KILLER @ ![]() ![]() std::string str(" blabla bala "); char* pStr = str.release(); //! вернули указатель на char, и обнулили внутрение буфера размеры и т.д. trim(pStr); //! далее либо работай с указателем, после чего вызывай delete pStr; Либо обратно передавай в свою строку: str.assign(pStr); //! PROFIT!!! И что должен вернуть str.length() после assign? |
|
Сообщ.
#5872
,
|
|
|
|
Цитата D_KEY @ Нарушая абстракцию и инкапсуляцию? Потрясающе. Где? Я всеголишь отдал внутрений буфер на ручное управление программисту. все str - пустой у меня. Цитата D_KEY @ И что должен вернуть str.length() после assign? Тоже что и сейчас возвращает. В общем у меня тут срочная задача появилась, далее не смогу активно участвовать, вечером только смогу продолжить. Добавлено Цитата D_KEY @ Да ты никак не понимаешь, что дело не столько в том, массив там или нет, сколько в том, что работать с буфером std::string строки, как с С-строкой - не правильно. std::string - это не null-terminated строка, даже если это массив. тоже самое могу сказать о векторе... |
|
Сообщ.
#5873
,
|
|
|
|
Цитата KILLER @ Цитата D_KEY @ И что должен вернуть str.length() после assign? Тоже что и сейчас возвращает. Т.е. он не будет учитывать то, что сделал trim? Великолепно |
|
Сообщ.
#5874
,
|
|
|
|
Цитата D_KEY @ Т.е. он не будет учитывать то, что сделал trim? Великолепно ![]() я тебя не понял![]() ![]() #include <iostream> #include <string> int main() { std::string s("abcdef"); char p[100]; strcpy( p, s.c_str() ); strcat(p+strlen(p), "KILLER"); s.assign(p); std::cout << s.length(); return 0; } У меня выводит 12, а у тебя что? |
|
Сообщ.
#5875
,
|
|
|
|
KILLER, может, реализуете "идеальные строки для C++". Ставлю месячную зп, что я за 10 минут найду в них кучу противоречий, нелогичного поведения, небезопасности и просто багов
|
|
Сообщ.
#5876
,
|
|
|
|
Цитата KILLER @ Цитата D_KEY @ Да ты никак не понимаешь, что дело не столько в том, массив там или нет, сколько в том, что работать с буфером std::string строки, как с С-строкой - не правильно. std::string - это не null-terminated строка, даже если это массив. тоже самое могу сказать о векторе... Правильно! А еще тоже самое можно сказать о массиве! И тут ты медленно подходишь к тому выводу, что в С и С++ нет никакого типа для C-строк. Этого всего-лишь соглашения по использованию массивов символов. А теперь ответь, что больше подходит для работы с массивом, std::vector или std::string ? |
|
Сообщ.
#5877
,
|
|
|
|
Цитата D_KEY @ И тут ты медленно подходишь к тому выводу, что в С и С++ нет никакого типа для C-строк. Этого всего-лишь соглашения по использованию массивов символов. А теперь ответь, что больше подходит для работы с массивом, std::vector или std::string ? именно с массивом - std::vector, потому как под массивом я подразумеваю любые данные, в т.ч. и бинарные. Ладно, хватит уже меня провоцировать на писать! Я так задачу не сделаю, пожалейте |
|
Сообщ.
#5878
,
|
|
|
|
Цитата KILLER @ Цитата D_KEY @ Т.е. он не будет учитывать то, что сделал trim? Великолепно ![]() я тебя не понял![]() ![]() #include <iostream> #include <string> int main() { std::string s("abcdef"); char p[100]; strcpy( p, s.c_str() ); strcat(p+strlen(p), "KILLER"); s.assign(p); std::cout << s.length(); return 0; } У меня выводит 12, а у тебя что? Причем тут этот код ?Я о том, что если ты предлагаешь простую передачу буфера туда-обратно, то для строки " KILLER "([<space>KILLER<space>\0]) после trim в буфере будет [KILLER\0<space><space>\0]. Теперь ты пытаешься вернуть буфер в std::string. И тут возникает два вопроса. Во-первых, как std::string определит размер буфера? Во-вторых, какой длины будет строка, с учетом того, что для std::string '\0' не обладает никакими специальными особенностями? Добавлено Цитата KILLER @ Цитата D_KEY @ И тут ты медленно подходишь к тому выводу, что в С и С++ нет никакого типа для C-строк. Этого всего-лишь соглашения по использованию массивов символов. А теперь ответь, что больше подходит для работы с массивом, std::vector или std::string ? именно с массивом - std::vector, потому как под массивом я подразумеваю любые данные, в т.ч. и бинарные. Ну так С-строки - это не отдельный тип, а соглашение по использованию массивов. |
|
Сообщ.
#5879
,
|
|
|
|
Цитата D_KEY @ Я о том, что если ты предлагаешь простую передачу буфера туда-обратно, то для строки " KILLER "([ KILLER \0]) после trim в буфере будет [KILLER\0 \0]. Теперь ты пытаешься вернуть буфер в std::string. И тут возникает два вопроса. Во-первых, как std::string определит размер буфера? Как он это делает сейчас? Я не совсем понял вопроса. Цитата D_KEY @ Во-вторых, какой длины будет строка, с учетом того, что для std::string '\0' не обладает никакими специальными особенностями? Я хочу задать тебе тотже вопрос, вот именно какой длины будет строка, с учетом того, что для std::string '\0' не обладает никакими специальными особенностями сейчас, на любом выбранном тобою компиляторе? Вот код: ![]() ![]() #include <iostream> #include <string> int main() { std::string s; const char* p = "str\0ing"; s.assign(p); std::cout << s.length(); return 0; } Я предполагаю что 3. Во всяком случае у меня так... |
|
Сообщ.
#5880
,
|
|
|
|
Цитата KILLER @ Я хочу задать тебе тотже вопрос, вот именно какой длины будет строка, с учетом того, что для std::string '\0' не обладает никакими специальными особенностями сейчас, на любом выбранном тобою компиляторе? ...[и далее по тексту] ![]() При чём тут это? Всё, я больше не могу... |