Это законный для записи в станд.:: строка?

Глядя на обе библиотеки, я заметил несколько вещей:

  1. У React-intel 210 открытых вопросов, у React-i18next 0
  2. У них обоих одинаковая еженедельная загрузка цифра (200-300 тысяч)
  3. Синтаксисы очень разные.

Справедливо сказать, что, поскольку большое количество людей использует каждую библиотеку, они оба будут работать и будут иметь большую сеть пользователей, которые могут вас поддержать.

Я думаю, что лучше всего, если вы посмотрите на каждый синтаксис и решите, какой из них вам больше нравится, потому что он будет широко использоваться в вашем коде. Имейте в виду, что React-intel имеет довольно мало открытых вопросов, поэтому может быть более ошибочным ...

14
задан e.James 17 April 2009 в 15:14
поделиться

5 ответов

std :: string будет иметь непрерывное хранилище с новым стандартом c ++ 0x. В настоящее время это неопределенное поведение.

17
ответ дан 1 December 2019 в 06:35
поделиться

Херб Саттер говорит следующее ( http://herbsutter.wordpress.com/2008/04/07/cringe-not-vectors-are-guaranteed-to-be-contiguous/#comment-483 ):

текущий ISO C ++ требует, чтобы & str [0] выдавал указатель на непрерывные строковые данные (но не обязательно с завершающим нулем!), Поэтому у разработчиков не было большой свободы действий, чтобы иметь несмежные строки , в любом случае. Для C ++ 0x мы уже приняли гарантию, что содержимое std :: string действительно должно храниться непрерывно. Для получения дополнительной информации см. http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#530

И Мэтт Остерн говорит, что подобное в указанном документе ( http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#530).

Итак, похоже, вы можете предположить, что после вызова str [0] вы действительно получаете изменяемый массив символов (но обратите внимание, что он не обязательно должен завершаться нулевым символом).

22
ответ дан 1 December 2019 в 06:35
поделиться

Да, вы можете изменить строку.

Вы также можете использовать его в алгоритмах, использующих итераторы.

Вы не можете использовать его так же, как vector <>, потому что нет гарантии, что элементы находятся в непрерывных ячейках памяти (пока: скоро вы получите стандарт).

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

template<typename I>
void toupper(I first,I last_plus_one)
{
    // Probably the same code as you had before.
}


{
     std::string  s("A long string With Camel Case");

     toupper(s.begin(),s.end());
}
5
ответ дан 1 December 2019 в 06:35
поделиться

As it has been pointed-out, one can use strings in algorithms that use iterators; the same case can be implemented using std::transform Ex:- consider a string 's' to be converted to lower case:

int (*pf)(int)=tolower; //lowercase
std::transform(s.begin(), s.end(), s.begin(), pf); 

Regards,

3
ответ дан 1 December 2019 в 06:35
поделиться

Я думаю, что это дает вам неопределенное поведение. Используйте строковый поток для записи, а затем используйте член str () для получения строки потока.

-2
ответ дан 1 December 2019 в 06:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: