Хорошая Идея / Плохая Идея я должен Повторно реализовать большую часть C++? [закрытый]

Не забывайте std::scanf:

#include <cstdio>

std::size_t s;
if (std::scanf("Array has size: %zu", &s)) { 
    // ...
}
else {
    throw MyException("Wrong format");
}
10
задан fluffels 12 March 2009 в 15:32
поделиться

20 ответов

Так, почему я не реализую менее общее, но легче использовать версию?

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

Честно, Ваш выбор прост:

Изучите C++ или не используйте его. Да, C++ является наиболее часто используемым для графики, но Java имеет библиотеки OpenGL также. Также - C#, Python и фактически любой язык. Или C. Вы не должны использовать C++.

Но если Вы действительно используете его, изучаете его и используете его правильно.

Если Вы хотите неизменные строки, создаете Вашу строку как константу.

И независимо от его конкретной реализации, замечательно прост в использовании STL.

Ошибки компилятора C++ могут быть считаны, но требуется немного практики. Но что еще более важно, они не эксклюзивны к коду STL. Вы встретитесь с ними независимо от того, что Вы делаете, и какими библиотеками Вы пользуетесь. Поэтому привыкните им. И если Вы привыкаете им так или иначе, Вы могли бы также использовать STL также.

Кроме этого, нескольких других недостатков:

  • Никто больше не поймет Ваш код. Если Вы задаете вопрос на ТАК о станд.:: вектор или двунаправленные итераторы, все, кто довольно знаком с C++, могут ответить. Если Вы просите примыкать к Моему:: CustomLinkedList, никто не может помочь Вам. Который неудачен, потому что прокрутка Вашего собственного также означает, что будет больше ошибок для обращений за помощью о.
  • Вы пытаетесь исправить признак, а не причину. Проблема состоит в том, что Вы не понимаете C++. STL является просто признаком этого. Предотвращение STL волшебно не заставит Ваш код C++ работать лучше.
  • Ошибки компилятора. Да, они противны для чтения, но они там. Большая работа в STL вошла в обеспечение, что неправильное использование инициирует ошибки компилятора в большинстве случаев. В C++ очень легко сделать код, который компилирует, но не работает. Или, кажется, работает. Или работы над моим компьютером, но перестал работать загадочно в другом месте. Ваш собственный связанный список почти наверняка переместил бы больше ошибок во время выполнения, куда они пойдут необнаруженные некоторое время и будут намного более тверды разыскать.
  • И еще раз, это будет багги.Поверьте мне. Я видел, что чертовски хорошие программисты на C++ пишут связанный список в C++ только для раскрытия ошибки после ошибки в неясных случаях границы. И C++ является всеми случаями границы. Ваш связанный список обработает безопасность исключения правильно? Это гарантирует, что все находится в согласованном состоянии, если создание нового узла (и таким образом вызов конструктора типа объекта) выдают исключение? То, что это не пропустит память, что все соответствующие деструкторы назовут? Это будет столь же безопасно с точки зрения типов? Это будет столь же производительно? Существует много головных болей для контакта с при записи контейнерных классов в C++.
  • Вы пропускаете одну из самых мощных и гибких существующих библиотек на любом языке. STL может сделать много, которое было бы болью даже с чрезмерно увеличенной в размере библиотекой классов гиганта Java. C++ уже достаточно тверд, никакая потребность выбросить несколько преимуществ, которые он предлагает.

Я не забочусь о средствах выделения, итераторы и т.п.

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

  • Контейнеры: Вы уже знаете о них. векторы, связанные списки, карты, наборы, очереди и так далее.
  • Итераторы: Абстракции, которые позволяют Вам переместиться по контейнеру (или подмножества контейнера или любая другая последовательность значения, в памяти, на диске в форме потоков, или вычисленный на лету).
  • Алгоритмы: Общие алгоритмы, которые работают над любой парой итераторов. Вы имеете вид, for_each, находите, копия и многие другие.

Да, STL является маленьким по сравнению с библиотекой Java, но это упаковывает удивительное количество энергии при объединении вышеупомянутых 3 понятий. Существует определенная кривая обучения, потому что это - необычная библиотека. Но если Вы собираетесь провести больше чем день или два с C++, это стоит изучить правильно.

И не, я не следую за Вашим форматом ответа, потому что я думал, на самом деле давая Вам, подробный ответ будет более полезным.;)

Править:

Было бы заманчиво сказать, что преимущество прокрутки Вашего собственного состоит в том, что Вы узнали бы больше языка, и возможно даже, почему STL является одной из своих граций сохранения.. Но я действительно не убежден, что это верно. Это могло бы работать, но это может иметь неприятные последствия также.

Как я сказал выше, легко написать код C++, который, кажется, работает. И когда это прекращает работать, легко перестроить несколько вещей, как порядок объявления переменных, или вставить немного дополнения в класс, заставить его по-видимому работать снова. Что Вы узнали бы из этого? Это учило бы Вас, как записать лучший C++? Возможно. Но скорее всего, это просто учило бы Вас, что "C++ сосет". Это учило бы Вас, как использовать STL?Точно нет. Более полезный подход мог бы использовать ужасающую энергию StackOverflow в изучении STL правильный путь.:)

76
ответ дан 3 December 2019 в 13:09
поделиться

Похоже на обновление вопроса поэтому теперь существует действительно два вопроса:

  1. Что должно я делать, если я думаю станд.:: библиотека слишком сложна для моих потребностей?

Разработайте свои собственные классы, которые внутренне используют соответствующий станд.:: функции библиотеки, чтобы сделать "тяжелый подъем" для Вас. Тем путем у Вас есть меньше для понимания превратно, и Вы все еще добираетесь для изобретения собственного интерфейса кодирования.

  1. Что я должен сделать, если я хочу изучить, как структуры данных работают?

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

0
ответ дан 3 December 2019 в 13:09
поделиться

STL очень сложен, потому что это должно быть для библиотеки общего назначения.

Причины, почему STL является способом, которым это:

  • На основе interators, таким образом, для стандартных алгоритмов только нужна единственная реализация для различных типов контейнеров.
  • Разработанный для поведения правильно перед лицом Исключений.
  • Разработанный, чтобы быть 'потоком', безопасным в многопоточных приложениях.

В большом количестве приложений однако у Вас действительно есть достаточно со следующим:

  • строковый класс
  • хеш-таблица для O (1) поиски
  • вектор/массив с видом / и двоичный поиск отсортированных наборов

Если Вы знаете что:

  • Ваши классы не выдают исключения на конструкции или присвоении.
  • Ваш код является единственным, распараллелил.
  • Вы не будете использовать более сложные алгоритмы STL.

Затем можно, вероятно, написать собственный более быстрый код, который использует меньше памяти и производит более простую компиляцию/ошибки периода выполнения.

Некоторые примеры для более быстрого/легче без STL:

  • Строка копии на записи со ссылкой считала строковый буфер. (Не делайте этого в многопоточной среде, так как необходимо было бы соединить доступ подсчета ссылок.)
  • Используйте хорошую хеш-таблицу вместо станд.:: набор и станд.:: карта.
  • Итераторы стиля 'Java', которые могут быть розданы как отдельный объект
  • Тип итератора, который не должен знать тип контейнера (В течение лучшего времени компиляции, разъединяясь кода)
  • Строковый класс с большим количеством служебных функций
  • Настраиваемые границы, регистрируясь в Ваших векторных контейнерах. (Так не [] или .at, но тот же метод с компиляцией или флагом во время выполнения для движения от 'безопасного' до 'быстрого' режима)
  • Контейнеры разработали для работы с указателями на объекты, которые удалят их содержание.
0
ответ дан 3 December 2019 в 13:09
поделиться

Недостаток: перереализация всего того хорошо (то есть, на высоком уровне качества), конечно, возьмет много великих разработчиков несколько лет.

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

каковы опасности, возможные недостатки и возможные преимущества для "прокрутки моего собственного" для большей части существующей функциональности в C++?

Можно ли предоставить и возможно выровнять ли по ширине количество усилия/времени/денег, потраченного позади изобретения велосипед?

Многократное использование повышения или подобный.

Довольно странный, что Вы не можете использовать Повышение. IIRC, блоки вклада входят от людей, связанных с в университетах (думайте Jakko Jarvi). Позитивные аспекты использования Повышения слишком много для списка здесь.

На 'не изобретении велосипед'

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

Преимущество: Обслуживание легче для людей, которые собираются наследовать это.

0
ответ дан 3 December 2019 в 13:09
поделиться

Как пример, с помощью STL выкладывает стопки непостижимых и искаженных ошибок компилятора

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

Вы могли сделать не основанные на шаблоне контейнеры и сохранить все как пустые указатели, или некоторый базовый класс, например, Кроме Вас потеряет чеки типа времени компиляции, и C++ сосет как динамический язык. Не столь безопасно сделать это, как это было бы в, например, Objective C, Python или Java. Одна из причин, являющихся, что C++ не имеет корневого класса для всех классов ко всему самоанализу на всех объектах и некоторой основной обработке ошибок во времени выполнения. Вместо этого Ваше приложение, вероятно, отказало бы и горело бы, если бы Вы были неправы относительно типа, и Вам не дали бы ключа к разгадке того, что пошло не так, как надо.

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

Преимущество

При изучении MFC Вы найдете, что Ваше предложение уже используется в продуктивном коде - и было так в течение долгого времени. Ни один из классов набора MFC не использует STL.

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

Недостаток: Вы - университетский курс, вероятно, размечается как это по причине. То, что Вы раздражены достаточно им (сарказм, не предназначенный), может указать, что Вы не получаете paridigm и извлечете выгоду много, когда у Вас есть сдвиг парадигмы.

2
ответ дан 3 December 2019 в 13:09
поделиться

Почему Вы не смотрите на существующие библиотеки C++. Назад, когда C++ не был вполне как сформировавшийся, люди часто писали свои собственные библиотеки. Взгляните на Symbian (довольно ужасный, хотя), QT и WxWidgets (если не изменяет память, меня) имеют основные наборы и материал, и существуют, вероятно, многие другие.

Мое мнение - то, что сложность STL происходит из сложности языка C++, и существует мало, можно сделать для изменения к лучшему STL (кроме использования более разумного соглашения о присвоении имен). Я рекомендую просто переключиться на некоторый другой язык, если Вы можете, или просто иметь дело с ним.

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

Недостаток:

Вы представляете зависимость от своей собственной новой библиотеки. Даже если это достаточно, и Ваша реализация хорошо работает, у Вас все еще есть зависимость. И это может укусить Вас трудно с обслуживанием кода. Все остальные (включая себя, через год, или даже месяц) не будут знакомы с Вашим поведением уникальной строки, специальными итераторами, и так далее. Много усилия будет необходимо только для адаптации к новой среде, прежде чем Вы могли когда-либо начинать осуществлять рефакторинг/расширять что-либо. Если Вы будете использовать что-то как STL, то все уже будут знать это, это хорошо понято и зарегистрировано, и никто не должен будет повторно изучать Вашу пользовательскую одноразовую среду.

3
ответ дан 3 December 2019 в 13:09
поделиться

Недостаток: по моему скромному мнению, reimplimenting протестированные и доказанные библиотеки rabit дыра, которая, как почти гарантируют, будет большей проблемой, чем это стоит.

4
ответ дан 3 December 2019 в 13:09
поделиться

Можно интересоваться EASTL, переписыванием Electronic Arts STL, зарегистрированного некоторое время назад. Их проектные решения главным образом управлялись определенными требованиями/потребностями в многоплатформенном программировании видеоигры. Краткий обзор в связанной статье подводит итог его приятно.

3
ответ дан 3 December 2019 в 13:09
поделиться

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

Когда мне была нужна степень универсальности, я сделал шаблонный массив.

Я также хотел выполнить итерации через него, не использование оператора [], но постепенное увеличение указателя как делает с C, таким образом, я не вычисляю адрес T [я] при каждом повторении... Я добавил два метода один для возврата указателя на выделенную память и другого, который возвращает указатель в конец. Для итерации через массив целого числа, я должен был записать что-то вроде этого:

for(int * p = array.pData(); p != array.pEnd(); ++p){
  cout<<*p<<endl; 
}

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

Только затем я замечаю, что имел, записал совершенно бесполезный клон станд.:: вектор <>.

По крайней мере теперь я знаю, почему я использую STL...

4
ответ дан 3 December 2019 в 13:09
поделиться

Я думаю, что необходимо сделать это.

Я уверен, что получу flambayed для этого, но Вы знаете, каждый программист на C++ здесь выпил немного слишком много STL coolaid.

STL является большой библиотекой, но я знаю из собственного опыта это, если Вы самокрутка, Вы можете:

1) Сделайте его быстрее, чем STL для Ваших конкретных вариантов использования. 2) Вы запишете библиотеку только с интерфейсами, в которых Вы нуждаетесь. 3) Вы сможете расширить весь стандартный материал. (Я не могу сказать Вам, какого количества я пожелал станд.:: строка имела разделение () метод)...

Все правы, когда они говорят, что это будет большая работа. Это правда.

Но, Вы изучите много. Даже если после записи этого Вы возвращаетесь к STL и никогда не используете его снова, Вы все еще изучите много.

8
ответ дан 3 December 2019 в 13:09
поделиться

Существует что-то, что можно сделать о загадочном компиляторе сообщения об ошибках STL. STLFilt поможет упростить их. С Веб-сайта STLFilt:

STLFilt упрощает и/или переформатировал многоречивые сообщения об ошибках C++ и предупреждающие сообщения с вниманием на связанную с STL диагностику (и для MSVC 6, он полностью устраняет предупреждения C4786 и их осколки). Результат представляет многую даже из самой загадочной понятной диагностики.

Взгляните здесь и при использовании VisualC, также здесь.

8
ответ дан 3 December 2019 в 13:09
поделиться

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

Преимущество: Вы, вероятно, изучите много!

8
ответ дан 3 December 2019 в 13:09
поделиться

Я предложил, чтобы Вы учились почему:

использование STL выкладывает стопки непостижимых и искаженных ошибок компилятора

сначала

13
ответ дан 3 December 2019 в 13:09
поделиться

Преимущества: еда Вашего собственного собачьего корма. Вы получаете точно, что Вы делаете.

Недостатки: еда Вашего собственного собачьего корма. Многочисленные люди, более умные, чем 99% из нас, провели годы, создавая STL.

22
ответ дан 3 December 2019 в 13:09
поделиться

Недостаток: никто, но Вы будете использовать его.

Преимущество: В процессе реализации его Вы изучите, почему Стандартная Библиотека является хорошей вещью.

43
ответ дан 3 December 2019 в 13:09
поделиться

Другой недостаток:

Если Вы захотите получить задание C++, когда Вы будете закончены с Университетом, большинство людей, которые хотели бы принять на работу Вас, будет ожидать, что Вы знакомы со Стандартом библиотека C++. Не обязательно глубоко знакомый уровню реализации, но конечно знакомый с его использованием и идиомами. При перереализации колеса в форме собственной библиотеки Вы пропустите тот шанс. Это не противостоит тому, что Вы, надо надеяться, узнаете много о дизайне библиотеки, если Вы самокрутка, которая могла бы заработать для Вас несколько дополнительного одобрения в зависимости от того, где Вы берете интервью.

3
ответ дан 3 December 2019 в 13:09
поделиться
Другие вопросы по тегам:

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