2009-11-12 41 views
1

C++中,为什么以下元素访问vector无效?为什么这个语法无效? vectorPointer - > [0]

void foo(std::vector<int>* vecPtr) { 
    int n = vecPtr->size(); // ok 
    int a = vecPtr->[0]; // invalid 
} 

相反,我们必须写这样一个方法调用较为烦琐

(*vecPtr)[0] = 1; 

我想,operator[]调用应该只是有相同的语法,我恨多余的明星和括号。 (我知道C++有很多更严重的问题,但是这一次让我很烦,每次当我必须键入它...)

+1

不是答案,但为什么你传递一个指向矢量的指针,而不是通过引用传递矢量?这将使函数内的函数更简单,同时明确指出调用者代码负责矢量的生命周期。 – 2009-11-12 07:18:13

回答

12

这是因为语言需要一个成员->后出现。这就是语言的组成部分。您可以使用函数调用语法,如果你喜欢

// not really nicer 
vecPtr->operator[](0); 

如果你必须这样做很多顺序,使用[0]代替括号可以提高可读性大大

vecPtr[0][0] 

否则,对于一个级别,我发现(*vecPtr)[0]对我来说是完全可读的。

+7

+1另外,你可以将矢量分配给裁判,这就是它! – AraK 2009-11-12 04:50:06

+0

但运算符[]是成员。 – Frank 2009-11-12 04:50:44

+0

“操作员作为方法调用”的好工作......你击败了我:) +1 – jheddings 2009-11-12 04:51:04

0

你似乎已经知道这应该是无效的语法,所以有什么问题?所写的唯一答案是“因为这是写这种语言的方式”。

在语义上,这是因为该[]操作基本上说“计算从所提供的地址的偏移量”;它不是一种方法,它是一个操作员。你给的语法并不是真的觉得它有道理。

而且,因为你描述的语法看起来很可怕,因为你只是在一个光秃秃的运营商,而不是预期的成员指出。

考虑使用参考,如果你想更直接的关于你的间接性(符号崩溃)。

+1

它是std :: vector的一种方法:: vector – 2009-11-12 04:53:03

+1

不,这是一种方法,如果你把它写成一个方法。正如所写的,它是一个运营商(尽管如此,但运营商超负荷运营)。 – phoebus 2009-11-12 05:04:16

5

除了litb's nice answer我应该说,没有在vector类的函数at,允许您按如下方式使用它:

int a = vecPtr->at(0); 

这个成员函数和成员运算功能operator[]之间的区别是,​​通过抛出out_of_range异常来发出请求的位置超出范围的信号。