#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. Я боюсь, что довольно скоро, если уже не сейчас, никто полностью не поймет, что там происходит.