【问题标题】:Howto understand pointer on vector in C++如何理解 C++ 中向量上的指针
【发布时间】:2013-06-17 20:09:17
【问题描述】:
class A {
    public:
        std::vector<int> & getIds(const int & item) const {
            return ids[item];
        }
    private:
        std::vector<int> * ids;
}

如果ids 是一个整数向量上的指针,那么为什么方法getIds,假设它使用隐藏向量的get 运算符[] 按索引,为什么它返回对整数向量的引用而不是int 如我所料。只是不明白这一点。

你能帮我把它转换成Java吗?请不要给缺点,尽力帮助。

【问题讨论】:

  • “如何理解 C++ 中向量上的指针”——通过学习 C++ 并仔细阅读源代码?
  • 没有边界检查? ...
  • 这不是我的代码,我正在转换为另一种语言,并卡在这里。
  • 这不是你的函数“说”它要做的吗?

标签: c++ vector


【解决方案1】:

ids 可能被假定为一个指向向量数组的元素的指针,例如:

A::A() : ids(new std::vector<int>[100]) { }

这是很糟糕的风格。

【讨论】:

  • 但是没有向量数组?!
  • @user2494797:是的,有。这并不明显,因为 C++ 不区分指向对象的指针和指向数组的指针。所以你得看一下指针是在哪里初始化的,看看它是指向单个对象还是指向一个数组,
  • 如果你能提供帮助,这也是不使用原始指针的另一个原因。 std::vector 显然是一个“数组”。
【解决方案2】:

声明std::vector&lt;int&gt; * ids; 表示这是一个指向std::vector&lt;int&gt; 类型的单个对象或该类型数组(的第一个元素)的指针。成员函数中使用operator[],说明第二种情况。

operator[] 应用于指针(如ids[item])访问指针指向的数组的元素(在本例中为编号为item 的元素)。数组中对象的类型 (std::vector&lt;int&gt;) 也定义了 operator[] 这一事实并不重要,因为此代码确实 not 调用它(您可以在此类上调用 operator[]通过添加另一个索引运算符,如ids[item][2],或通过取消引用指针,如(*ids)[2](相当于ids[0][2])来创建一个对象。

【讨论】:

  • 谢谢您的解释。我认为这只是第一种方式。
  • 为了迂腐,它很可能是指向数组第五个元素的指针...
【解决方案3】:

在 C 和 C++ 中,数组只是指针(std::array 除外,我没有在谈论它)。 [] 符号只是隐藏了一些指针运算。

int foo[10]; //foo is essentially and int *

int bar;

bar = *(foo + 3);  //This statement is equivalent to the next

bar = foo[3]; //This just means get what's pointed to 3 pointers away from the address foo

std::vector 是一个类。

std::vector<int> *ids

只描述一个指向std::vector&lt;int&gt; 实例的指针,而不是指向其中可能包含的数据。

【讨论】:

  • 数组不是指针!仅供参考,std::is_same&lt;int[], int *&gt;::value 是错误的。
  • 我特别说过我不是在谈论 std::array。我在代码示例中声明的数组或多或少是指针。
  • 看看我提供的代码。 std::array 根本不在那里。数组太容易衰减为指针了。
  • 另一个可以看出区别的例子是int array[10]; 在一个翻译单元中,extern int* array 在另一个翻译单元中。尝试在两个翻译单元中使用array 的代码将显示未定义的行为(很可能在第二个翻译单元尝试访问array 的元素时出现分段错误)。请注意,这在 C 中完全相同。
  • 数组不是完全指针,但你可以这样想,指针算术适用于它们,就像你可以在指针中使用括号一样。摘自《The C Programming Language》,“在C语言中,指针和数组之间有很强的关系,强到应该同时讨论指针和数组。任何可以通过数组下标实现的操作,也可以用指针来完成。”
猜你喜欢
  • 2019-09-10
  • 1970-01-01
  • 2020-06-24
  • 1970-01-01
  • 1970-01-01
  • 2011-02-18
  • 1970-01-01
  • 2020-04-13
  • 2011-07-25
相关资源
最近更新 更多