繁体   English   中英

在 std::vector 的 [] 运算符中返回引用

[英]return reference in [] operator of std::vector

请考虑这种情况。 我正在为 [] 运算符创建一个 function ,就像在 std::vector 中一样,它的内部是这样的:

int temp;
if(argument >= 0 && argument < size) {
    return &my_vector[i];
} else {
    cout << "out of bounds" << endl;
    //i need to return here something but this gives me an error: local variable cannot be returned by reference.
    return &temp;
}

其中参数是传递给 function 的参数。 此 function 的返回类型为“T*”。

我正在寻找读写案例:

vector[100] = 1;

int answer = vector[100];

这就是为什么它们通过引用返回。

else 部分应该返回什么?

首先,您返回的不是引用,而是指针,这使得该方法不是很有用。 代替

vector[100] = 1;
int answer = vector[100];

你必须写

*vector[100] = 1;
int answer = *vector[100];

为了得到你想要的,你应该返回一个引用而不是一个指针。 即返回类型应该是T&而不是T*

那么你基本上有两个选择。 要么你模仿向量operator[] 它不做任何边界检查。 由调用者确保传递有效的索引:

return my_vector[i];  // thats all (assuming my_vector[i] returns a reference)

另一种选择是像std::vector::at那样抛出异常:

if(i >= 0 && i< size) {
    return my_vector[i];
} else {
    throw std::out_of_range("invalid index");
}

您不能返回对局部变量的引用,因为一旦方法返回并且局部变量的生命周期结束,该引用就会悬空。

您必须选择哪种方法更适合。 std::vector两者都提供。 通常在循环中调用该方法时:

 for (size_t i=0; i<size;++i) {
     foo[i] = i;
 }

您不想在每次访问时产生检查索引的开销。 另一方面,有时会计算索引并且调用者希望封装边界检查而不是手动进行:

try {
    size_t index = some_function();   // is this a valid index?!?
    foo.at(i) = 42;                   // let at check it
} catch(...) {
    //...
}

PS:这些访问器通常需要两个重载,一个const和一个非常量,分别返回const T&T&

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM