Могу ли я на законных основаниях записать данные, на которые указывает постоянный вектор, например, отсортировать их? - PullRequest
2 голосов
/ 16 октября 2019

У меня постоянный целочисленный вектор const vector<int> v = {5,1,3,2,4}. Как я могу отсортировать его без использования дополнительной памяти, такой как вектор, массив и т. Д.

Ответы [ 3 ]

5 голосов
/ 16 октября 2019

Вы не можете.

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

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

3 голосов
/ 16 октября 2019

Как вы показали в своем ответе, решение состоит в том, чтобы отбросить const из вектора, то есть:

vector<int>&temp = const_cast<vector<int>&>(v);
sort(temp.begin(), temp.end());

Это работает, потому что вы не изменяете состояние вектора. Единственное, что стандарт говорит о неопределенном поведении и отбрасывании const, находится в [dcl.type.cv] / 4

Любая попытка изменить ( [expr.ass] , [expr.post.incr] , [expr.pre.incr] ) константный объект ( [basic.type.qualifier] ) в течение своей жизни ( [basic.life] ) приводит к неопределенному поведению. [...]

Ничто в [expr.ass], [expr.post.incr] и [expr.pre.incr] не применимо к этому примеру, поэтому вас не считаютизменение объекта.


Я чувствую, что это дефект. Порядок элементов имеет значение для операторов сравнения, поэтому должна применяться модификация .

0 голосов
/ 16 октября 2019

Я тестировал с помощью C ++ 11. В моей работе это нормально работает для меня

Вы можете отсортировать любой контейнер констант в c ++, используя указатель.

В вашем случае, если вы хотите отсортировать этот вектор, используя sort(v.begin(),v.end()) тогда это приведет к некоторой ошибке во время выполнения из-за нарушения const.

Но вы можете отсортировать ваш контейнер следующим образом -

vector<int>*temp=(vector<int>*)&v;
sort(temp->begin(),temp->end());

После этого ваша константавектор v будет выглядеть так:

const vector<int> v = {1,2,3,4,5}

View of my working code and output

...