По какой причине такие функции, как std::sort (), напрямую изменяют вектор, а не возвращают значение?

#c

Вопрос:

Я новичок в C и мне интересно, почему std::sort() напрямую изменяется массив. Я, естественно, подумал бы, что sort() функция должна быть такой:

 anyVector = sort(anyVector.begin(), anyVector.end());
 

Мой вопрос: как std::sort() понять, что он должен изменить порядок содержимого массива, если вы не упоминаете сам массив для повторного назначения?

Я знаю, что это может показаться тривиальным вопросом, но я не нашел никакого объяснения (возможно, потому, что это очевидно для многих).

Комментарии:

1. std::sort делает сортировку на месте .

2. std::sort() сортирует диапазон, предоставляемый парой итераторов — первый для начала последовательности, второй — один за последним. Передача целого vector -это всего лишь вариант использования.

3. Мне просто нужно было ключевое слово «на месте» спасибо, теперь я прочитал, что означает «передать по ссылке», я обновил свои старые понятия C указателями, теперь понятно, почему сортировка использует ссылку и напрямую изменяет значение. Большое вам спасибо @Eljay!

4. Пожалуйста. 🙂 » Я бы, естественно, подумал… » Я также, естественно, так думаю, так как сюрпризов меньше (ссылочная прозрачность, неизменность… которые больше относятся к лагерю функционального программирования ). Благодаря изменчивости на месте уменьшается объем памяти, что может иметь решающее значение во многих довольно распространенных ситуациях и обеспечивает некоторые гарантии. Я просто хотел бы, чтобы это было имя std::sort_in_place . Увы, этот корабль отплыл.

Ответ №1:

Такие алгоритмы, как std::sort «не знаю о контейнере». Вы передаете итераторы, и алгоритм работает с итераторами. Следовательно std::sort , не имеет возможности вернуть вектор.

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

 std::vector<int> my_sort(const std::vector<int>amp; v) {
      auto result = v; // passing v by value and returning it defeats NRVO
      std::sort(result.begin(), result.end());
      return resu<
}
 

Но другого пути нет. Если алгоритм сделает копию, вы не сможете легко превратить его во что-то, что не делает копию.

Комментарии:

1. В вашем примере можно было бы использовать настройку, поскольку NRVO нельзя использовать, так v как это параметр функции. Для этого требуется ненужная копия значения.

2. @Bathsheba переместится в какой-нибудь локальный вектор, а затем вернет его?

3. Или пройдите по ссылке const и создайте копию внутри

4. @Bathsheba Я нахожу всю эту историю с копированием немного раздражающей, потому что многое изменилось, и я не совсем понимаю это.

5. Я боюсь, что довольно скоро, если уже не сейчас, никто полностью не поймет, что там происходит.