обрезка не является частью стандарта c/c ++ библиотека?

Я думаю, что следующий код работает

dict_x1=dict(x1)
for item in x2:
  if item[0] in dictx1:
    dictx1[item[0]] += item[1]
  else:
    dictx1[item[0] = item[1]
16
задан Community 23 May 2017 в 12:34
поделиться

6 ответов

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

  • совместимость повреждения с существующим кодом (который, возможно, определил его собственную обрезку ()
  • , Добавляет больше работы для разработчиков компилятора (у кого уже был огромный объем работы перед ними)
  • , Делают язык более сложным, чтобы изучить и использовать.

С обрезкой (), нет никаких главных проблем совместимости. Пока Ваша сторонняя обрезка () реализация берет строку и возвращает строку, мы действительно не заботимся, где она определяется. Таким образом, это не действительно необходимо В стандартной библиотеке. Это может быть легко предоставлено другими библиотеками.

, В отличие от этого, что-то как строковый класс или вектор, классы, которые должна предоставить стандартная библиотека, потому что при использовании класса пользовательской строки, только строковые операции из той библиотеки будут работать. Со стандартной строкой библиотеки сторонние библиотеки могут быть нацелены на это общее строковое определение, и все побеждают.

, Когда последний стандарт вышел, Herb Sutter записал сообщение, описывающее это очень хорошо здесь

, Конечно, будет хорошо иметь обрезку () функция, но у них была важная персона для жарки. Они должны были стандартизировать все основы сначала. Я не думаю, что C++ 0x добавит функцию для обрезки, но он добавит много других утилит удобства, которые назад в '98 считали "ненужными" или слишком специализированными.

16
ответ дан 30 November 2019 в 15:41
поделиться

Нет, необходимо записать это сами или пользоваться некоторой другой библиотекой как Повышение и т.д.

В C++, Вы могли сделать:

#include <string>

const std::string whiteSpaces( " \f\n\r\t\v" );


void trimRight( std::string& str,
      const std::string& trimChars = whiteSpaces )
{
   std::string::size_type pos = str.find_last_not_of( trimChars );
   str.erase( pos + 1 );    
}


void trimLeft( std::string& str,
      const std::string& trimChars = whiteSpaces )
{
   std::string::size_type pos = str.find_first_not_of( trimChars );
   str.erase( 0, pos );
}


void trim( std::string& str, const std::string& trimChars = whiteSpaces )
{
   trimRight( str, trimChars );
   trimLeft( str, trimChars );
} 
29
ответ дан 30 November 2019 в 15:41
поделиться

Как другие сказали, комитет был занят (многими) другие проблемы. Повышение заполнило некоторые разрывы, как с string_algo библиотекой функции обрезки :

string testTrim(" \n\r\r\n \r\n text here\nwith return \n\r\r\n \r\n ");
trim(testTrim);
cout << testTrim;
3
ответ дан 30 November 2019 в 15:41
поделиться

В былые времена, с scanf () , одно пространство соответствовало бы любому количеству пробельных символов.

Поэтому мы использовали fgets () сопровождаемый sscanf () . Предотвратить соответствие новой строке как часть того пробела.

1
ответ дан 30 November 2019 в 15:41
поделиться

Я не знаю слишком много о C++, но проверка это , чтобы видеть, как выполнить это в C. (В моей защите: Вы действительно говорили C/C ++ в заголовке :-)

1
ответ дан 30 November 2019 в 15:41
поделиться

Вы можете использовать VC ++. Класс CString имеет функцию обрезки. : D

-1
ответ дан 30 November 2019 в 15:41
поделиться
Другие вопросы по тегам:

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