Просто добавьте еще один, более базовый подход:
st = ""
for char in u:
st = "{0}{1}{2}".format( st, char, l[ u.index( char ) ] )
Путем взятия струны до C++ 03 std::fstream
класс уменьшил зависимость от std::string
класс. В C++ 11, однако, std::fstream
класс действительно позволяет передавать std::string
для его параметра конструктора.
Теперь, можно ли задаться вопросом, почему не там прозрачное преобразование из std:string
к струне до, таким образом, класс, который ожидает струну до, мог все еще взять std::string
точно так же, как класс, который ожидает std::string
, может взять струну до.
причина состоит в том, что это вызвало бы цикл преобразования, который в свою очередь может привести к проблемам. Например, предположите std::string
, было бы конвертируемо к струне до так, чтобы Вы могли использовать std::string
с с [1 110] с. Предположим также, что струна до конвертируема к [1 111] с, как состояние в текущем стандарте. Теперь, рассмотрите следующее:
void f(std::string str1, std::string str2);
void f(char* cstr1, char* cstr2);
void g()
{
char* cstr = "abc";
std::string str = "def";
f(cstr, str); // ERROR: ambiguous
}
, поскольку можно преобразовать так или иначе между std::string
и струна до, которую вызов к [1 113] мог разрешить к любому из два f()
альтернативы, и таким образом неоднозначно. Решение состоит в том, чтобы повредить цикл преобразования путем создания одного направления преобразования явным, который является тем, что STL принял решение сделать с [1 115].
Существует несколько мест, где комитет по стандарту C++ действительно не оптимизировал взаимодействие между средствами в стандартной библиотеке.
std::string
и его использование в библиотеке один из них.
Еще один пример std::swap
. Много контейнеров имеют функцию членства подкачки, но никакую перегрузку станд.:: подкачка предоставляется. То же идет для std::sort
.
я надеюсь, что все эти мелочи будут зафиксированы в предстоящем стандарте.
Возможно, это - утешение: весь fstream's получил открытое (строковая константа &...) рядом с открытым (символьная константа *...) в рабочем проекте C++ 0x стандарт. (см., например, 27.8.1.6 для basic_ifstream объявления)
Поэтому, когда оно завершено и реализовало, это не будет больше получать Вас:)
Потоковая библиотека IO была добавлена к стандартной библиотеке C++ перед STL. Для не повреждения обратной совместимости было решено постараться не изменять библиотеку IO, когда STL был добавлен, даже если это означало некоторые проблемы как та, которую Вы повышаете.
Bernard:
"Непредставленные в виде строки" Монолиты. "Все для одного, и один для всех" могут работать на Мушкетеров, но это не работает почти также на разработчиков класса. Вот пример, который является не в целом образцовым, и он иллюстрирует, как плохо можно пойти не так, как надо, когда дизайн превращается в сверхдизайн. Пример, к сожалению, взят из стандартной библиотеки около Вас... ~ http://www.gotw.ca/gotw/084.htm
Это несущественно, который верен. Что делает Вы подразумеваете под станд.:: интерфейс строки, являющийся большим? Что делает большой средний в этом контексте - много вызовов метода? Я не остроумен, мне на самом деле интересно.
Это имеет больше методов, чем этому действительно нужно, и его поведение использования интегральных смещений, а не итераторов немного сомнительно (поскольку это противоречит пути остальная часть работ библиотеки).
реальная проблема, я думаю, - то, что библиотека C++ имеет три части; это имеет старую библиотеку C, это имеет STL, и это имеет strings-iostreams. Хотя некоторые усилия были приложены для образования моста различных частей (например, добавление перегрузок к библиотеке C, потому что перегрузка поддержек C++; добавление итераторов к basic_string; добавление iostream адаптеров итератора), существует много несоответствий при рассмотрении детали.
, Например, basic_string включает методы, которые являются ненужными дубликатами стандартных алгоритмов; различные методы находки, мог, вероятно, быть безопасно удален. Другой пример: локали используют необработанные указатели вместо итераторов.
Есть ли любой класс в STL, который берет строку... Я не думаю так (не мог найти никого в моем быстром поиске). Таким образом, это - вероятно, некоторое проектное решение, что никакой класс в STL не должен зависеть ни от какого другого класса STL (который не непосредственно необходим для функциональности).
Я полагаю, что об этом думали и сделали для предотвращения зависимости; т.е. #include < fstream> не должен вызывать тот к #include < string>.
Честно говоря, это походит вполне на несущественную проблему. Лучший вопрос был бы, почему станд.:: интерфейс строки, настолько большой?