【问题标题】:Const vector values vs pointer?常量向量值与指针?
【发布时间】:2022-01-08 13:16:25
【问题描述】:

在 C++ 中,我知道如何将向量作为指针传递:

void my_func (vector<int>* arr)

但是我该如何实现:

  1. 将向量设为常量,即不允许更改 arr = ...

  2. 将向量的值设为常量,即不允许更改 arr 的值。

我在这里阅读了很多帖子,但对 const 与 vector 等复杂 DS 的含义感到非常困惑。

【问题讨论】:

    标签: c++ vector constants


    【解决方案1】:

    将参数标记为const,可以满足您的两个愿望:

    void my_func(const vector<int> * arr)
    

    ...虽然除非出于某种原因您需要能够传递 NULL 指针,但最好通过引用传递数组而不是通过指针传递:

    void my_func(const vector<int> & arr)
    

    请注意,您可以同时拥有 (1) 和 (2),或者两者都没有,但不能只有一个而不是另一个。修改向量的成员值被认为是修改向量,因此将向量标记为const 会禁止这两种类型的修改。

    【讨论】:

      【解决方案2】:

      基本上情况是

      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;
      }
      

      【讨论】:

        【解决方案3】:

        经验法则:const 适用于左边的东西,除非那里什么都没有,否则它适用于右边的东西。

        所以...

        将向量设为常量,即不允许更改 arr = ...

        vector&lt;int&gt;* const arr 将把const 应用到*,即arr 将是一个const 指向一个非常量vector 的指针。 arr 本身不能更改为指向不同的vector 对象,但vector 本身可以在通过arr 访问时修改其成员。

        将向量的值设为常量,即不允许更改 arr 的值。

        const vector&lt;int&gt;* arr(或vector&lt;int&gt; const * arr)将const应用于vector,即arr将是一个指向const vector对象的非常量指针。 vector 的成员在通过arr 访问时无法修改,但arr 本身可以更改为指向不同的const vector 对象。

        然后,如果需要,您可以将两者结合起来:

        const vector&lt;int&gt;* const arr(或vector&lt;int&gt; const * const arr)将使arr成为const指向const vector对象的指针。指针和vector 都不能更改/修改。

        【讨论】:

          猜你喜欢
          • 2014-02-23
          • 2020-03-25
          • 2011-08-04
          • 1970-01-01
          • 2012-04-22
          • 2020-10-23
          • 1970-01-01
          • 2021-10-02
          • 1970-01-01
          相关资源
          最近更新 更多