return 在 std::vector 的 [] 运算符中引用
return reference in [] operator of std::vector
请考虑这种情况。
我正在为 [] 运算符创建一个函数,就像在 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;
}
其中参数是传递给函数的参数。此函数的 return 类型是 'T*'.
我正在寻找读写案例:
vector[100] = 1;
和int answer = vector[100];
这就是为什么它们是 return 通过引用编辑的。
else 部分应该return编辑什么?
首先,你不是return引用,而是一个指针,这使得该方法不是很有用。而不是
vector[100] = 1;
int answer = vector[100];
你必须写
*vector[100] = 1;
int answer = *vector[100];
要得到你想要的东西,你应该return引用而不是指针。即 return 类型应该是 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");
}
您不能 return 对局部变量的引用,因为一旦方法 returns 和局部变量生命周期结束,该引用就会悬空。
您必须选择更适合的方法。 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
和一个非常量,returning const T&
和 T&
,分别。
请考虑这种情况。 我正在为 [] 运算符创建一个函数,就像在 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;
}
其中参数是传递给函数的参数。此函数的 return 类型是 'T*'.
我正在寻找读写案例:
vector[100] = 1;
和int answer = vector[100];
这就是为什么它们是 return 通过引用编辑的。
else 部分应该return编辑什么?
首先,你不是return引用,而是一个指针,这使得该方法不是很有用。而不是
vector[100] = 1;
int answer = vector[100];
你必须写
*vector[100] = 1;
int answer = *vector[100];
要得到你想要的东西,你应该return引用而不是指针。即 return 类型应该是 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");
}
您不能 return 对局部变量的引用,因为一旦方法 returns 和局部变量生命周期结束,该引用就会悬空。
您必须选择更适合的方法。 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
和一个非常量,returning const T&
和 T&
,分别。