Как вы можете отсортировать постоянный вектор?

#c #vector

#c #вектор

Вопрос:

Если у меня есть постоянный вектор, определенный в моем классе, как я могу его отсортировать?

Попытка отсортировать const-вектор приведет к ошибкам, так как я изменяю содержимое const-вектора.

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

1. Почему это const, если вам нужно его изменить?

Ответ №1:

Вы этого не делаете. Если вам нужно его изменить… ну, тогда этого не должно быть const . Две цели находятся в прямом конфликте друг с другом.

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

 #include <vector>

class Foo
{
public:
    // clients can't change this vector directly
    const std::vector<int>amp; get_vector() const { return _vec; }

    // you can still create an interface that allows 
    // mutation of the vector in a safe way, or mutate
    // the vector internally.
    void push_back( int i ) { _vec.push_back( i ); }
private:
    std::vector<int> _vec;
}
 

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

1. @Rob: Рэймонд Чен сказал это лучше всего: прежде чем разрабатывать решение, убедитесь, что вы действительно понимаете проблему

Ответ №2:

Это вектор, который является const? Или данные внутри него, которые должны быть постоянными?

Если у вас есть постоянный вектор, то, вероятно, есть причина, по которой его не следует изменять….

Это, как говорится. Вот псевдокод о том, как вы можете выстрелить себе в ногу:

 const std::vector< Foo* > v;  // hypothetical declaration
std::vector< Foo* >* vPtr = const_cast< std::vector< Foo* >* >(amp;v);
// GOOD LUCK
(*vPtr)[0] = new Foo(); 
 

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

1. 1 за комментарий «вот как вы можете выстрелить себе в ногу». 🙂

Ответ №3:

Да, вы можете отсортировать постоянный вектор в C .

Пусть постоянный вектор равен v.

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

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

Но вот волшебство-

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

Вы можете отсортировать вектор v, используя другой векторный указатель и ссылаясь на него.

После этого, если вы напечатаете вектор v, вы получите вывод следующим образом —

 for(int a:v)
    cout<<a<<" ";
cout<<endl;
 

Вывод: 1 2 3 4 5

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

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