【发布时间】:2022-01-08 13:16:25
【问题描述】:
在 C++ 中,我知道如何将向量作为指针传递:
void my_func (vector<int>* arr)
但是我该如何实现:
-
将向量设为常量,即不允许更改 arr = ...
-
将向量的值设为常量,即不允许更改 arr 的值。
我在这里阅读了很多帖子,但对 const 与 vector 等复杂 DS 的含义感到非常困惑。
【问题讨论】:
在 C++ 中,我知道如何将向量作为指针传递:
void my_func (vector<int>* arr)
但是我该如何实现:
将向量设为常量,即不允许更改 arr = ...
将向量的值设为常量,即不允许更改 arr 的值。
我在这里阅读了很多帖子,但对 const 与 vector 等复杂 DS 的含义感到非常困惑。
【问题讨论】:
将参数标记为const,可以满足您的两个愿望:
void my_func(const vector<int> * arr)
...虽然除非出于某种原因您需要能够传递 NULL 指针,但最好通过引用传递数组而不是通过指针传递:
void my_func(const vector<int> & arr)
请注意,您可以同时拥有 (1) 和 (2),或者两者都没有,但不能只有一个而不是另一个。修改向量的成员值被认为是修改向量,因此将向量标记为const 会禁止这两种类型的修改。
【讨论】:
基本上情况是
void do_something( std::vector<int>* ptr_to_vec) {
ptr_to_vec->push_back(42);
(*ptr_to_vec)[0] = 5;
}
void cannot_do_something(const std::vector<int>* ptr_to_vec) {
// both of the following will not compile
//ptr_to_vec->push_back(42);
//(*ptr_to_vec)[0] = 5;
}
【讨论】:
经验法则:const 适用于左边的东西,除非那里什么都没有,否则它适用于右边的东西。
所以...
将向量设为常量,即不允许更改 arr = ...
vector<int>* const arr 将把const 应用到*,即arr 将是一个const 指向一个非常量vector 的指针。 arr 本身不能更改为指向不同的vector 对象,但vector 本身可以在通过arr 访问时修改其成员。
将向量的值设为常量,即不允许更改 arr 的值。
const vector<int>* arr(或vector<int> const * arr)将const应用于vector,即arr将是一个指向const vector对象的非常量指针。 vector 的成员在通过arr 访问时无法修改,但arr 本身可以更改为指向不同的const vector 对象。
然后,如果需要,您可以将两者结合起来:
const vector<int>* const arr(或vector<int> const * const arr)将使arr成为const指向const vector对象的指针。指针和vector 都不能更改/修改。
【讨论】: