#c #vector #constants
#c #вектор #константы
Вопрос:
В C я знаю, как передать вектор в качестве указателя:
void my_func (vectorlt;intgt;* arr)
Но как я могу реализовать:
- Сделайте вектор постоянным, т. е. не допускайте изменения arr = …
- Сделайте значения вектора постоянными, т. е. не допускайте изменений значений 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
указатель не могут быть изменены/изменены.