Не забывайте std::scanf
:
#include <cstdio>
std::size_t s;
if (std::scanf("Array has size: %zu", &s)) {
// ...
}
else {
throw MyException("Wrong format");
}
Так, почему я не реализую менее общее, но легче использовать версию?
Поскольку Вы не можете. Поскольку независимо от того, что Вы могли бы сказать о C++, это не простой язык, и если Вы не будете уже очень хороши в нем, то Ваша реализация связанного списка будет багги.
Честно, Ваш выбор прост:
Изучите C++ или не используйте его. Да, C++ является наиболее часто используемым для графики, но Java имеет библиотеки OpenGL также. Также - C#, Python и фактически любой язык. Или C. Вы не должны использовать C++.
Но если Вы действительно используете его, изучаете его и используете его правильно.
Если Вы хотите неизменные строки, создаете Вашу строку как константу.
И независимо от его конкретной реализации, замечательно прост в использовании STL.
Ошибки компилятора C++ могут быть считаны, но требуется немного практики. Но что еще более важно, они не эксклюзивны к коду STL. Вы встретитесь с ними независимо от того, что Вы делаете, и какими библиотеками Вы пользуетесь. Поэтому привыкните им. И если Вы привыкаете им так или иначе, Вы могли бы также использовать STL также.
Кроме этого, нескольких других недостатков:
Я не забочусь о средствах выделения, итераторы и т.п.
Средства выделения могут быть безопасно проигнорированы. Вы в значительной степени не должны даже знать, что они существуют. Итераторы являются блестящими, хотя, и понимание их сохранил бы Вас много головных болей. Существует только три понятия, которые необходимо понять для использования STL эффективно:
Да, STL является маленьким по сравнению с библиотекой Java, но это упаковывает удивительное количество энергии при объединении вышеупомянутых 3 понятий. Существует определенная кривая обучения, потому что это - необычная библиотека. Но если Вы собираетесь провести больше чем день или два с C++, это стоит изучить правильно.
И не, я не следую за Вашим форматом ответа, потому что я думал, на самом деле давая Вам, подробный ответ будет более полезным.;)
Править:
Было бы заманчиво сказать, что преимущество прокрутки Вашего собственного состоит в том, что Вы узнали бы больше языка, и возможно даже, почему STL является одной из своих граций сохранения.. Но я действительно не убежден, что это верно. Это могло бы работать, но это может иметь неприятные последствия также.
Как я сказал выше, легко написать код C++, который, кажется, работает. И когда это прекращает работать, легко перестроить несколько вещей, как порядок объявления переменных, или вставить немного дополнения в класс, заставить его по-видимому работать снова. Что Вы узнали бы из этого? Это учило бы Вас, как записать лучший C++? Возможно. Но скорее всего, это просто учило бы Вас, что "C++ сосет". Это учило бы Вас, как использовать STL?Точно нет. Более полезный подход мог бы использовать ужасающую энергию StackOverflow в изучении STL правильный путь.:)
Похоже на обновление вопроса поэтому теперь существует действительно два вопроса:
Разработайте свои собственные классы, которые внутренне используют соответствующий станд.:: функции библиотеки, чтобы сделать "тяжелый подъем" для Вас. Тем путем у Вас есть меньше для понимания превратно, и Вы все еще добираетесь для изобретения собственного интерфейса кодирования.
Разработайте свой собственный набор классов структуры данных с нуля. Затем попытайтесь выяснить, почему стандартные лучше.
STL очень сложен, потому что это должно быть для библиотеки общего назначения.
Причины, почему STL является способом, которым это:
В большом количестве приложений однако у Вас действительно есть достаточно со следующим:
Если Вы знаете что:
Затем можно, вероятно, написать собственный более быстрый код, который использует меньше памяти и производит более простую компиляцию/ошибки периода выполнения.
Некоторые примеры для более быстрого/легче без STL:
Недостаток: перереализация всего того хорошо (то есть, на высоком уровне качества), конечно, возьмет много великих разработчиков несколько лет.
каковы опасности, возможные недостатки и возможные преимущества для "прокрутки моего собственного" для большей части существующей функциональности в C++?
Можно ли предоставить и возможно выровнять ли по ширине количество усилия/времени/денег, потраченного позади изобретения велосипед?
Многократное использование повышения или подобный.
Довольно странный, что Вы не можете использовать Повышение. IIRC, блоки вклада входят от людей, связанных с в университетах (думайте Jakko Jarvi). Позитивные аспекты использования Повышения слишком много для списка здесь.
На 'не изобретении велосипед'
Недостаток: В то время как Вы изучаете много, Вы также задерживаете себя, когда Вы задумываетесь о том, каковы Ваши реальные цели проекта.
Преимущество: Обслуживание легче для людей, которые собираются наследовать это.
Как пример, с помощью STL выкладывает стопки непостижимых и искаженных ошибок компилятора
Причиной этого являются шаблоны чрезвычайно C++. При использовании шаблонов (как STL делает), Вы получите стопки непостижимых сообщений об ошибках. Таким образом, при реализации собственных основанных на шаблоне классов набора, Вы не будете ни в каком лучшем месте.
Вы могли сделать не основанные на шаблоне контейнеры и сохранить все как пустые указатели, или некоторый базовый класс, например, Кроме Вас потеряет чеки типа времени компиляции, и C++ сосет как динамический язык. Не столь безопасно сделать это, как это было бы в, например, Objective C, Python или Java. Одна из причин, являющихся, что C++ не имеет корневого класса для всех классов ко всему самоанализу на всех объектах и некоторой основной обработке ошибок во времени выполнения. Вместо этого Ваше приложение, вероятно, отказало бы и горело бы, если бы Вы были неправы относительно типа, и Вам не дали бы ключа к разгадке того, что пошло не так, как надо.
Преимущество
При изучении MFC Вы найдете, что Ваше предложение уже используется в продуктивном коде - и было так в течение долгого времени. Ни один из классов набора MFC не использует STL.
Недостаток: Вы - университетский курс, вероятно, размечается как это по причине. То, что Вы раздражены достаточно им (сарказм, не предназначенный), может указать, что Вы не получаете paridigm и извлечете выгоду много, когда у Вас есть сдвиг парадигмы.
Почему Вы не смотрите на существующие библиотеки C++. Назад, когда C++ не был вполне как сформировавшийся, люди часто писали свои собственные библиотеки. Взгляните на Symbian (довольно ужасный, хотя), QT и WxWidgets (если не изменяет память, меня) имеют основные наборы и материал, и существуют, вероятно, многие другие.
Мое мнение - то, что сложность STL происходит из сложности языка C++, и существует мало, можно сделать для изменения к лучшему STL (кроме использования более разумного соглашения о присвоении имен). Я рекомендую просто переключиться на некоторый другой язык, если Вы можете, или просто иметь дело с ним.
Недостаток:
Вы представляете зависимость от своей собственной новой библиотеки. Даже если это достаточно, и Ваша реализация хорошо работает, у Вас все еще есть зависимость. И это может укусить Вас трудно с обслуживанием кода. Все остальные (включая себя, через год, или даже месяц) не будут знакомы с Вашим поведением уникальной строки, специальными итераторами, и так далее. Много усилия будет необходимо только для адаптации к новой среде, прежде чем Вы могли когда-либо начинать осуществлять рефакторинг/расширять что-либо. Если Вы будете использовать что-то как STL, то все уже будут знать это, это хорошо понято и зарегистрировано, и никто не должен будет повторно изучать Вашу пользовательскую одноразовую среду.
Недостаток: по моему скромному мнению, reimplimenting протестированные и доказанные библиотеки rabit дыра, которая, как почти гарантируют, будет большей проблемой, чем это стоит.
Можно интересоваться EASTL, переписыванием Electronic Arts STL, зарегистрированного некоторое время назад. Их проектные решения главным образом управлялись определенными требованиями/потребностями в многоплатформенном программировании видеоигры. Краткий обзор в связанной статье подводит итог его приятно.
Немного моего опыта: Не то, чтобы давно я реализовал свой собственный подобный вектору класс, потому что мне было нужно хорошее управление на нем.
Когда мне была нужна степень универсальности, я сделал шаблонный массив.
Я также хотел выполнить итерации через него, не использование оператора [], но постепенное увеличение указателя как делает с C, таким образом, я не вычисляю адрес T [я] при каждом повторении... Я добавил два метода один для возврата указателя на выделенную память и другого, который возвращает указатель в конец. Для итерации через массив целого числа, я должен был записать что-то вроде этого:
for(int * p = array.pData(); p != array.pEnd(); ++p){
cout<<*p<<endl;
}
Затем, когда я начинаю использовать векторы векторов, я выясняю, что, когда это было возможно, можение выделяет крупный блок памяти вместо того, чтобы называть новым много раз. В это время я добавляю средство выделения к шаблонному классу.
Только затем я замечаю, что имел, записал совершенно бесполезный клон станд.:: вектор <>.
По крайней мере теперь я знаю, почему я использую STL...
Я думаю, что необходимо сделать это.
Я уверен, что получу flambayed для этого, но Вы знаете, каждый программист на C++ здесь выпил немного слишком много STL coolaid.
STL является большой библиотекой, но я знаю из собственного опыта это, если Вы самокрутка, Вы можете:
1) Сделайте его быстрее, чем STL для Ваших конкретных вариантов использования. 2) Вы запишете библиотеку только с интерфейсами, в которых Вы нуждаетесь. 3) Вы сможете расширить весь стандартный материал. (Я не могу сказать Вам, какого количества я пожелал станд.:: строка имела разделение () метод)...
Все правы, когда они говорят, что это будет большая работа. Это правда.
Но, Вы изучите много. Даже если после записи этого Вы возвращаетесь к STL и никогда не используете его снова, Вы все еще изучите много.
Существует что-то, что можно сделать о загадочном компиляторе сообщения об ошибках STL. STLFilt поможет упростить их. С Веб-сайта STLFilt:
STLFilt упрощает и/или переформатировал многоречивые сообщения об ошибках C++ и предупреждающие сообщения с вниманием на связанную с STL диагностику (и для MSVC 6, он полностью устраняет предупреждения C4786 и их осколки). Результат представляет многую даже из самой загадочной понятной диагностики.
Недостаток: можно провести больше времени, отлаживая библиотеку классов, чем решение безотносительно университетской задачи, которую Вы имеете перед Вами.
Преимущество: Вы, вероятно, изучите много!
Я предложил, чтобы Вы учились почему:
использование STL выкладывает стопки непостижимых и искаженных ошибок компилятора
сначала
Преимущества: еда Вашего собственного собачьего корма. Вы получаете точно, что Вы делаете.
Недостатки: еда Вашего собственного собачьего корма. Многочисленные люди, более умные, чем 99% из нас, провели годы, создавая STL.
Недостаток: никто, но Вы будете использовать его.
Преимущество: В процессе реализации его Вы изучите, почему Стандартная Библиотека является хорошей вещью.
Другой недостаток:
Если Вы захотите получить задание C++, когда Вы будете закончены с Университетом, большинство людей, которые хотели бы принять на работу Вас, будет ожидать, что Вы знакомы со Стандартом библиотека C++. Не обязательно глубоко знакомый уровню реализации, но конечно знакомый с его использованием и идиомами. При перереализации колеса в форме собственной библиотеки Вы пропустите тот шанс. Это не противостоит тому, что Вы, надо надеяться, узнаете много о дизайне библиотеки, если Вы самокрутка, которая могла бы заработать для Вас несколько дополнительного одобрения в зависимости от того, где Вы берете интервью.