取消引用 std::vector 通过引用传递
Dereferencing std::vector passed by reference
我有一个快速(也可能是愚蠢的)问题,但我无法在网上找到答案:
当我通过引用传递结构时,我可以通过 MyArray->Field1
、MyArray->Field2
等很好地干净地访问它的字段
对于 std::vector
的元素是否有类似的方法?我知道做到这一点的唯一方法是 MyVector[0][0]
、MyVector[0][1]
等,或者可能做 std::vector<double> MyVector2 = *MyVector;
然后 MyVector2[0, 1, 2...] = 1.0...
编辑:哇,Whosebug 快速关闭了我的问题...
我想,我对按引用传递和按指针传递感到困惑。我不确定,在我的情况下更好的解决方案是:基本上我有一个 class,我将 std::vector*
设置为“外部”std::vector
。它多次使用这个向量,所以出于性能原因我不想一直复制它(而且 class 也会更改它)。通过指针传递它,如上所述,我必须写一些类似 MyVector[0][0] = 3;
的东西,虽然它工作得很好,但它看起来不太好。
根据 wohlstads 的回答(感谢您的解释),更好的写法是 (*MyVector)[0] = 3;
。
通过引用传递 std::vector
允许您访问其 public 成员,例如:
void f(std::vector<int> & v)
{
v.resize(1);
v[0] = 3;
}
但是,您在问题中使用的语法实际上看起来像是通过指针传递。您也可以使用 std::vector
来做到这一点,但在 C++ 中,我们通常更喜欢通过引用传递。如果你有充分的理由通过指针而不是引用传递,你可以这样做:
void f(std::vector<int> * pV)
{
pV->resize(1);
(*pV)[0] = 3;
}
*pV
两边的括号是必需的,因为运算符 []
优先于取消引用运算符 (*
);没有这些,*pV[0]
将被解释为 *(pV[0])
。
我有一个快速(也可能是愚蠢的)问题,但我无法在网上找到答案:
当我通过引用传递结构时,我可以通过 MyArray->Field1
、MyArray->Field2
等很好地干净地访问它的字段
对于 std::vector
的元素是否有类似的方法?我知道做到这一点的唯一方法是 MyVector[0][0]
、MyVector[0][1]
等,或者可能做 std::vector<double> MyVector2 = *MyVector;
然后 MyVector2[0, 1, 2...] = 1.0...
编辑:哇,Whosebug 快速关闭了我的问题...
我想,我对按引用传递和按指针传递感到困惑。我不确定,在我的情况下更好的解决方案是:基本上我有一个 class,我将 std::vector*
设置为“外部”std::vector
。它多次使用这个向量,所以出于性能原因我不想一直复制它(而且 class 也会更改它)。通过指针传递它,如上所述,我必须写一些类似 MyVector[0][0] = 3;
的东西,虽然它工作得很好,但它看起来不太好。
根据 wohlstads 的回答(感谢您的解释),更好的写法是 (*MyVector)[0] = 3;
。
通过引用传递 std::vector
允许您访问其 public 成员,例如:
void f(std::vector<int> & v)
{
v.resize(1);
v[0] = 3;
}
但是,您在问题中使用的语法实际上看起来像是通过指针传递。您也可以使用 std::vector
来做到这一点,但在 C++ 中,我们通常更喜欢通过引用传递。如果你有充分的理由通过指针而不是引用传递,你可以这样做:
void f(std::vector<int> * pV)
{
pV->resize(1);
(*pV)[0] = 3;
}
*pV
两边的括号是必需的,因为运算符 []
优先于取消引用运算符 (*
);没有这些,*pV[0]
将被解释为 *(pV[0])
。