Я программист Python / Scala / Haskell, пытаюсь выучить C ++, и мне трудно что-либо помнить, потому что многие имена методов или классов в C ++ не имеют для меня никакого смысла. Возможно, это потому, что я не понимаю, что они на самом деле собираются делать. Можете ли вы кто-нибудь объяснить это для меня:
vector
— вектор это такая странная вещь, чтобы называть список или последовательность вещей. Почему вектор?unordered_set
— Почему бы не просто set
? С каких пор упорядочиваются наборы? Не устанавливает косвенно означает, что порядок не имеет значения, и упорядоченная версия (TreeSets java) должна явно называться ordered_set
вместо??vector.cend
— Что значит уступить? Я не смог найти cend в английском словаре? Почему бы просто не назвать это концом?emplace
— Что значит emplace? Не лучше ли слово «вставить»?push_back
— Почему бы просто не позвонить push
или же append
? Не является ли «задняя» часть неявной? empty()
вернуть логическое значение? Не должно ли это быть isEmpty()
? .begin()
а также .end()
кажется противоречивым. begin()
это глагол в то время как end()
является существительным в этом контексте. начало обозначает начало чего-либо, тогда как оно просто возвращает указатель на начало. Не должен ли метод быть вызван либо start
который является существительным и хорошо сочетается с «концом» или beginning
по крайней мере, вместо begin
list.unique
не делает вообще то, что я думаю, это делает — это просто отбросы последовательный похожие предметы!?! (огромное нарушение принципа наименьшего удивления) — как ни странно, вы можете делать уникальные правильно и в линейном времени выполнения с дополнительным хэш-наборомУ меня есть намного больше, но если я поймаю вышеупомянутое, мне, возможно, будет легче изучать C ++. Спасибо!
vector
: Есть векторы и в функциональных языках, например этот пакетunordered_set
— Неупорядоченный / упорядоченный относится к базовой реализации; как элементы на самом деле хранятся.vector.cend
— cend
постоянный итератор, указывающий на конец Постоянные итераторы не позволяют изменять значение, на которое указывает итератор.emplace
— Emplace похож на insert, за исключением того, что он создает объект «на месте»; вы передаете emplace параметры, которые вы передадите конструктору объекта.push_back
— Это для поддержания единого интерфейса. Некоторые контейнеры, такие как std :: list, позволяют push_frontempty()
вернуть логическое значение? Не должно ли это быть isEmpty()
?: Должно ли это? Говорит кто? Вы привыкли к Python / Scala / Haskell, но вряд ли это единственный верный путь..begin()
а также .end()
кажется противоречивым. begin()
это глагол в то время как end()
является существительным в этом контексте. начало обозначает начало чего-либо, тогда как оно просто возвращает указатель на начало. Не должен ли метод быть вызван либо start
который является существительным и хорошо сочетается с «концом» или beginning
по крайней мере, вместо begin
: Я полагаю. Это похоже на мелкую хватку. Просто так оно и есть.list.unique
не вернуть set
? Кажется странным, что он не только изменяет структуру данных (исходя из функционального мира, кажется действительно странным изменять данные как побочные эффекты), и это вдвойне странно, поскольку в C ++ уже есть наборы. Я понимаю unique
неправильно ??: многие вещи будут странными, если вы перенесете это мышление без побочных эффектов в C ++. Тот же открытый ум, который позволит вам изучать Python / Scala / Haskell, должен быть применен к C ++, если вы серьезно относитесь к его изучению. list.unique
больше похоже на Руби Array#uniq
, От документация:Обратите внимание, что элемент удаляется из контейнера списка только в том случае, если он сравнивается с элементом, непосредственно предшествующим ему. Таким образом, эта функция особенно полезна для отсортированных списков.
Как описано, возврат набора потеряет информацию, поскольку он не сохранит дубликаты в случае, когда они не являются последовательными.
Как я уже сказал, если вы серьезно относитесь к изучению C ++, вам придется иметь дело с некоторыми из этих решений по дизайну языка / библиотеки. Многие из этих моментов кажутся мне мелочами. Некоторые из них «просто так». Некоторые вещи в C ++ просто сумасшедшие, но если вы серьезно относитесь к C ++, что вы собираетесь делать? Действительно, например, у Haskell более простой дизайн, который «естественно следует», но это другой язык. Надеюсь, ты справишься с этим.
в C ++ стратегия именования сильно отличается от других языков.
Но, как вы упомянули, они назвали функцию push_back
просто потому что в некоторых контейнерах вроде deque
имеет push_front
(это двойной конец
ntrainer).
И мы используем такие функции, как clear
опустошить контейнер вместо empty
,
Кроме того, в C ++, контейнер набора упорядочен. Он сортирует элементы в среднем за O (nlogn) раз.
За unique
в частности, речь идет об эффективности; это на самом деле должно называться compact
, Он уплотняет последовательные равные элементы в один элемент, что можно сделать в O (n), где в качестве возврата set
будет O (n log n), и будет нести расходы на строительство и перемещение объектов вокруг.
вектор — вектор — такая странная вещь, чтобы называть список или последовательность вещей. Почему вектор?
C ++ также имеет std::list<T>
который является двусвязным списком. Я вроде согласен, что это можно назвать массивом, но опять же это не фиксированный размер.
unordered_set — почему бы не просто набор? С каких пор упорядочиваются наборы? Не устанавливает косвенно означает, что порядок не имеет значения, и вместо этого упорядоченную версию (TreeSets java) следует явно называть order_set ??
C ++ 03 уже имеет std::set<T>
упорядоченный набор на основе поисковых деревьев. C ++ 11 добавил unordered_set<T>
, который основан на хеш-таблицах. Возникла необходимость различать упорядоченный набор по имени set
и новый unordered_set
,
vector.cend — Что значит cend? Я не смог найти cend в английском словаре? Почему бы просто не назвать это концом?
end()
функция-член возвращает iterator
или же const_iterator
в зависимости от контекста. cend()
функция всегда возвращает const_iterator
, Это полезно в некоторых ситуациях.
emplace — Что означает emplace? Не лучше ли слово «вставить»?
Уже существует insert()
функция-член, которая принимает значение типа T
, emplace()
отличается, его аргументы передаются непосредственно в конструктор T
тип и T
значение строится на месте в нужном месте в контейнере.
push_back — Почему бы просто не вызвать push или добавить? Не является ли «задняя» часть неявной?
Это вероятно для паритета с std::deque
«s push_front()
,
Почему empty () возвращает логическое значение? Разве это не должно быть isEmpty ()?
Стандартная библиотека C ++ нигде не использует регистр верблюдов. Это нарушит общий стиль. Ни один не использует это is_foo()
стиль.
Также .begin () и .end () кажутся несовместимыми. begin () — глагол, а end () — существительное в этом контексте. начало обозначает начало чего-либо, тогда как оно просто возвращает указатель на начало. Не должен ли метод быть вызван либо start, который является существительным и хорошо сочетается с «end», либо начинанием, по крайней мере, вместо begin
Я не являюсь носителем английского языка, но я верю, что начало и конец можно интерпретировать как существительные и глаголы.
Почему list.unique не возвращает набор? Кажется странным, что он не только изменяет структуру данных (исходя из функционального мира, кажется действительно странным изменять данные как побочные эффекты), и это вдвойне странно, поскольку в C ++ уже есть наборы. Я правильно понимаю, что неправильно?
Работает на std::list
с существующими функциями, не являющимися членами (std::unique()
) может быть менее эффективным. std::list
также обеспечивает sort()
функция-член для оптимизации сортировки. (Можно отсортировать двусвязные списки за время O (n * log n).)