На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (495) « Первая ... 390 391 [392] 393 394 ...  494 495  ( Перейти к последнему сообщению )  
> Delphi vs C++ vs C# , ну и Java немножко, где-то ближе к старшему байту номеров страниц
    D_KEY, а где возгласы про то, что std::string работает оптимальнее массива ? Я их уже чего то не вижу. Вы ведь сначало именно на это делали акцент. Мол де, std::string работает со своим внутренним буфером, который оптимальнее для строк, и может представлять собой сущность отличную от массива, на деле - это самый обыкновенный std::vector, с некоторыми примочками, и не более.
      Цитата KILLER @
      Цитата D_KEY @
      И что?
      Логика работы стандартных С++ строк не зависит от 0-символа. Он обрабатывается точно так же, как и любой другой.

      То, что std::string в большинстве реализаций представляет собой обыкновенный массив, такой же как и вектор, ничуть не лучше и не хуже.

      Да причем тут это? Этого не достаточно для правильной логики работы со строками. Даже если можно было бы передать std::string на запись в С-апи, это только нарушит логику работы строки. Тот же твой trim впендюрит \0 в нужную позицию и все. Для С-строк этого достаточно, для std::string - нет, т.к. он не наделяет '\0' каким-то особым смыслом.
      Ты хочешь изменения логики работы этого класса так, чтобы он работал именно с null-terminated строками, а это бред.
        Цитата D_KEY @
        Зачем ты эту жесть выложил? Чтобы в теме было побольше страшного кода на С++ :D ?

        Ниче страшного, вроде понятно там все :D

        Цитата D_KEY @
        Он к ним имеет такое же отношение, как и массив.

        memcpy - также работает с массивами данных. в нашем случае массив char'ов. Но зато, ты предлаегаешь мне создавать временный вектор, вместо использования уже существующего массива.. Да хоть бы отдавал указатель, через какой нить новый метод release. Кому нужно - юзает, кому не нужно, пусть не юзает. Проблемы то собственно и нет...
          Цитата KILLER @
          D_KEY, а где возгласы про то, что std::string работает оптимальнее массива ? Я их уже чего то не вижу. Вы ведь сначало именно на это делали акцент.

          Я вообще ничего подобного не говорил.

          Добавлено
          KILLER, С-строки это не просто массив. Ключевой особенностью null-terminated string является наличие специального символа-терминатора, на котором строится вся логика работы со строками.
          Даже если std::string всегда хранит линейный буфер памяти, как и вектор(по новому стандарту вроде так и есть), это не делает std::string null-terminated строками.
          Сообщение отредактировано: D_KEY -
            Цитата D_KEY @
            Даже если можно было бы передать std::string на запись в С-апи, это только нарушит логику работы строки. Тот же твой trim впендюрит \0 в нужную позицию и все. Для С-строк этого достаточно, для std::string - нет, т.к. он не наделяет '\0' каким-то особым смыслом.

            ExpandedWrap disabled
              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 строками.

            Зато я спокойно без лишних компирований могу его таким какой он мне нужен сделать.
            Сообщение отредактировано: KILLER -
              Цитата KILLER @
              memcpy - также работает с массивами данных. в нашем случае массив char'ов. Но зато, ты предлаегаешь мне создавать временный вектор, вместо использования уже существующего массива.. Да хоть бы отдавал указатель, через какой нить новый метод release. Кому нужно - юзает, кому не нужно, пусть не юзает. Проблемы то собственно и нет...

              Да ты никак не понимаешь, что дело не столько в том, массив там или нет, сколько в том, что работать с буфером std::string строки, как с С-строкой - не правильно. std::string - это не null-terminated строка, даже если это массив.

              Добавлено
              Цитата KILLER @
              ExpandedWrap disabled
                std::string str(" blabla bala ");
                 
                char* pStr = str.release(); //! вернули указатель на char, и обнулили внутрение буфера размеры и т.д.
                trim(pStr);
                 
                //! далее либо работай с указателем, после чего вызывай delete pStr; Либо обратно передавай в свою строку:
                 
                str.assign(pStr); //! PROFIT!!!

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

              Цитата
              Зато я спокойно без лишних компирований могу его таким какой он мне нужен сделать.

              Нарушая абстракцию и инкапсуляцию? Потрясающе.

              Добавлено
              Цитата KILLER @
              ExpandedWrap disabled
                std::string str(" blabla bala ");
                 
                char* pStr = str.release(); //! вернули указатель на char, и обнулили внутрение буфера размеры и т.д.
                trim(pStr);
                 
                //! далее либо работай с указателем, после чего вызывай delete pStr; Либо обратно передавай в свою строку:
                 
                str.assign(pStr); //! PROFIT!!!

              И что должен вернуть str.length() после assign?
              Сообщение отредактировано: D_KEY -
                Цитата D_KEY @
                Нарушая абстракцию и инкапсуляцию? Потрясающе.

                Где? Я всеголишь отдал внутрений буфер на ручное управление программисту. все str - пустой у меня.

                Цитата D_KEY @
                И что должен вернуть str.length() после assign?

                Тоже что и сейчас возвращает.

                В общем у меня тут срочная задача появилась, далее не смогу активно участвовать, вечером только смогу продолжить.

                Добавлено
                Цитата D_KEY @
                Да ты никак не понимаешь, что дело не столько в том, массив там или нет, сколько в том, что работать с буфером std::string строки, как с С-строкой - не правильно. std::string - это не null-terminated строка, даже если это массив.

                тоже самое могу сказать о векторе...
                  Цитата KILLER @
                  Цитата D_KEY @
                  И что должен вернуть str.length() после assign?

                  Тоже что и сейчас возвращает.

                  Т.е. он не будет учитывать то, что сделал trim? Великолепно :D
                    Цитата D_KEY @
                    Т.е. он не будет учитывать то, что сделал trim? Великолепно :D

                    :huh: я тебя не понял
                    ExpandedWrap disabled
                      #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, может, реализуете "идеальные строки для C++". Ставлю месячную зп, что я за 10 минут найду в них кучу противоречий, нелогичного поведения, небезопасности и просто багов :)
                        Цитата KILLER @
                        Цитата D_KEY @
                        Да ты никак не понимаешь, что дело не столько в том, массив там или нет, сколько в том, что работать с буфером std::string строки, как с С-строкой - не правильно. std::string - это не null-terminated строка, даже если это массив.

                        тоже самое могу сказать о векторе...

                        Правильно! А еще тоже самое можно сказать о массиве!
                        И тут ты медленно подходишь к тому выводу, что в С и С++ нет никакого типа для C-строк. Этого всего-лишь соглашения по использованию массивов символов. А теперь ответь, что больше подходит для работы с массивом, std::vector или std::string ;) ?
                          Цитата D_KEY @
                          И тут ты медленно подходишь к тому выводу, что в С и С++ нет никакого типа для C-строк. Этого всего-лишь соглашения по использованию массивов символов. А теперь ответь, что больше подходит для работы с массивом, std::vector или std::string ;) ?

                          именно с массивом - std::vector, потому как под массивом я подразумеваю любые данные, в т.ч. и бинарные.

                          Ладно, хватит уже меня провоцировать на писать! Я так задачу не сделаю, пожалейте :D
                            Цитата KILLER @
                            Цитата D_KEY @
                            Т.е. он не будет учитывать то, что сделал trim? Великолепно :D

                            :huh: я тебя не понял
                            ExpandedWrap disabled
                              #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, а у тебя что?

                            Причем тут этот код :wacko: ?
                            Я о том, что если ты предлагаешь простую передачу буфера туда-обратно, то для строки " 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, потому как под массивом я подразумеваю любые данные, в т.ч. и бинарные.

                            Ну так С-строки - это не отдельный тип, а соглашение по использованию массивов.
                            Сообщение отредактировано: D_KEY -
                              Цитата D_KEY @
                              Я о том, что если ты предлагаешь простую передачу буфера туда-обратно, то для строки " KILLER "([ KILLER \0]) после trim в буфере будет [KILLER\0 \0].
                              Теперь ты пытаешься вернуть буфер в std::string. И тут возникает два вопроса. Во-первых, как std::string определит размер буфера?

                              Как он это делает сейчас? Я не совсем понял вопроса.

                              Цитата D_KEY @
                              Во-вторых, какой длины будет строка, с учетом того, что для std::string '\0' не обладает никакими специальными особенностями?

                              Я хочу задать тебе тотже вопрос, вот именно какой длины будет строка, с учетом того, что для std::string '\0' не обладает никакими специальными особенностями сейчас, на любом выбранном тобою компиляторе?
                              Вот код:
                              ExpandedWrap disabled
                                #include <iostream>
                                #include <string>
                                 
                                int main()
                                {
                                 
                                   std::string s;
                                   const char* p = "str\0ing";
                                   s.assign(p);
                                   std::cout << s.length();
                                    
                                   return 0;
                                }

                              Я предполагаю что 3. Во всяком случае у меня так...
                                Цитата KILLER @
                                Я хочу задать тебе тотже вопрос, вот именно какой длины будет строка, с учетом того, что для std::string '\0' не обладает никакими специальными особенностями сейчас, на любом выбранном тобою компиляторе?
                                ...[и далее по тексту]

                                :wall: :wall: :wall: :wall:
                                При чём тут это? Всё, я больше не могу...
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (495) « Первая ... 390 391 [392] 393 394 ...  494 495


                                Рейтинг@Mail.ru
                                [ Script execution time: 0.5292 ]   [ 14 queries used ]   [ Generated: 30.07.26, 10:07 GMT ]