дизайн языка — Объяснение имен методов C ++ std lib

Я программист Python / Scala / Haskell, пытаюсь выучить C ++, и мне трудно что-либо помнить, потому что многие имена методов или классов в C ++ не имеют для меня никакого смысла. Возможно, это потому, что я не понимаю, что они на самом деле собираются делать. Можете ли вы кто-нибудь объяснить это для меня:

  1. vector — вектор это такая странная вещь, чтобы называть список или последовательность вещей. Почему вектор?
  2. unordered_set — Почему бы не просто set? С каких пор упорядочиваются наборы? Не устанавливает косвенно означает, что порядок не имеет значения, и упорядоченная версия (TreeSets java) должна явно называться ordered_set вместо??
  3. vector.cend — Что значит уступить? Я не смог найти cend в английском словаре? Почему бы просто не назвать это концом?
  4. emplace — Что значит emplace? Не лучше ли слово «вставить»?
  5. push_back — Почему бы просто не позвонить push или же append? Не является ли «задняя» часть неявной?
  6. Почему empty() вернуть логическое значение? Не должно ли это быть isEmpty()?
  7. Так же .begin() а также .end() кажется противоречивым. begin() это глагол в то время как end() является существительным в этом контексте. начало обозначает начало чего-либо, тогда как оно просто возвращает указатель на начало. Не должен ли метод быть вызван либо start который является существительным и хорошо сочетается с «концом» или beginning по крайней мере, вместо begin
  8. Также, list.unique не делает вообще то, что я думаю, это делает — это просто отбросы последовательный похожие предметы!?! (огромное нарушение принципа наименьшего удивления) — как ни странно, вы можете делать уникальные правильно и в линейном времени выполнения с дополнительным хэш-набором

У меня есть намного больше, но если я поймаю вышеупомянутое, мне, возможно, будет легче изучать C ++. Спасибо!

-6

Решение

  1. vector: Есть векторы и в функциональных языках, например этот пакет
  2. unordered_set — Неупорядоченный / упорядоченный относится к базовой реализации; как элементы на самом деле хранятся.
  3. vector.cendcend постоянный итератор, указывающий на конец Постоянные итераторы не позволяют изменять значение, на которое указывает итератор.
  4. emplace — Emplace похож на insert, за исключением того, что он создает объект «на месте»; вы передаете emplace параметры, которые вы передадите конструктору объекта.
  5. push_back — Это для поддержания единого интерфейса. Некоторые контейнеры, такие как std :: list, позволяют push_front
  6. Почему empty() вернуть логическое значение? Не должно ли это быть isEmpty()?: Должно ли это? Говорит кто? Вы привыкли к Python / Scala / Haskell, но вряд ли это единственный верный путь.
  7. Так же .begin() а также .end() кажется противоречивым. begin() это глагол в то время как end() является существительным в этом контексте. начало обозначает начало чего-либо, тогда как оно просто возвращает указатель на начало. Не должен ли метод быть вызван либо start который является существительным и хорошо сочетается с «концом» или beginning по крайней мере, вместо begin: Я полагаю. Это похоже на мелкую хватку. Просто так оно и есть.
  8. Почему list.unique не вернуть set? Кажется странным, что он не только изменяет структуру данных (исходя из функционального мира, кажется действительно странным изменять данные как побочные эффекты), и это вдвойне странно, поскольку в C ++ уже есть наборы. Я понимаю unique неправильно ??: многие вещи будут странными, если вы перенесете это мышление без побочных эффектов в C ++. Тот же открытый ум, который позволит вам изучать Python / Scala / Haskell, должен быть применен к C ++, если вы серьезно относитесь к его изучению. list.unique больше похоже на Руби Array#uniq, От документация:

Обратите внимание, что элемент удаляется из контейнера списка только в том случае, если он сравнивается с элементом, непосредственно предшествующим ему. Таким образом, эта функция особенно полезна для отсортированных списков.

Как описано, возврат набора потеряет информацию, поскольку он не сохранит дубликаты в случае, когда они не являются последовательными.

Как я уже сказал, если вы серьезно относитесь к изучению C ++, вам придется иметь дело с некоторыми из этих решений по дизайну языка / библиотеки. Многие из этих моментов кажутся мне мелочами. Некоторые из них «просто так». Некоторые вещи в C ++ просто сумасшедшие, но если вы серьезно относитесь к C ++, что вы собираетесь делать? Действительно, например, у Haskell более простой дизайн, который «естественно следует», но это другой язык. Надеюсь, ты справишься с этим.

1

Другие решения

в C ++ стратегия именования сильно отличается от других языков.
Но, как вы упомянули, они назвали функцию push_back просто потому что в некоторых контейнерах вроде deque имеет push_front (это двойной конец
ntrainer).
И мы используем такие функции, как clear опустошить контейнер вместо empty,
Кроме того, в C ++, контейнер набора упорядочен. Он сортирует элементы в среднем за O (nlogn) раз.

2

За unique в частности, речь идет об эффективности; это на самом деле должно называться compact, Он уплотняет последовательные равные элементы в один элемент, что можно сделать в O (n), где в качестве возврата set будет O (n log n), и будет нести расходы на строительство и перемещение объектов вокруг.

1

вектор — вектор — такая странная вещь, чтобы называть список или последовательность вещей. Почему вектор?

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).)

1
По вопросам рекламы [email protected]