Значения вектора Const против указателя?

#c #vector #constants

#c #вектор #константы

Вопрос:

В C я знаю, как передать вектор в качестве указателя:

 void my_func (vectorlt;intgt;* arr)  

Но как я могу реализовать:

  1. Сделайте вектор постоянным, т. е. не допускайте изменения arr = …
  2. Сделайте значения вектора постоянными, т. е. не допускайте изменений значений arr.

Я прочитал здесь много постов, но слишком сильно запутался в значении константы со сложными DS, такими как вектор и другие.

Ответ №1:

Оба ваших желания могут быть удовлетворены, пометив аргумент как const :

 void my_func(const vectorlt;intgt; * arr)  

… хотя, если вам по какой-либо причине не нужно передавать нулевой указатель, лучше передавать массив по ссылке, чем по указателю:

 void my_func(const vectorlt;intgt; amp; arr)  

Обратите внимание, что у вас могут быть и (1), и (2), или ни то, ни другое, но не одно и не другое. Изменение значений элементов вектора считается изменением вектора, поэтому пометка вектора как const запрещает оба типа изменений.

Ответ №2:

В основном ситуация такова

 void do_something( std::vectorlt;intgt;* ptr_to_vec) {  ptr_to_vec-gt;push_back(42);  (*ptr_to_vec)[0] = 5; }  void cannot_do_something(const std::vectorlt;intgt;* ptr_to_vec) {  // both of the following will not compile  //ptr_to_vec-gt;push_back(42);  //(*ptr_to_vec)[0] = 5; }  

Ответ №3:

Эмпирическое правило: const применяется к вещи слева, если только там ничего нет, тогда оно применяется к вещи справа.

Так…

Сделайте вектор постоянным, т. е. не допускайте изменения arr = …

vectorlt;intgt;* const arr будет применяться const к * , т. е. arr будет const указателем на неконстант vector . arr сам по себе не может быть изменен, чтобы указывать на другой vector объект, но vector сам по себе может изменять свои элементы при доступе через arr .

Сделайте значения вектора постоянными, т. е. не допускайте изменений значений arr.

const vectorlt;intgt;* arr (или vectorlt;intgt; const * arr ) будет применяться const к vector , т. е. arr будет неконстантным указателем на const vector объект. Элементы vector s не могут быть изменены при доступе через arr , но arr сами по себе могут быть изменены, чтобы указывать на другой const vector объект.

А затем вы можете объединить их, если это необходимо:

const vectorlt;intgt;* const arr (или vectorlt;intgt; const * const arr ) сделает arr const указатель на const vector объект. Ни указатель, ни vector указатель не могут быть изменены/изменены.