[英]How to use const_reference type to declare a variable and assign to it, the return value of front() function
我声明了一个向量并用三个值初始化它,
vector<int> vec{1, 2, 3};
我试图将 vec.front() 的返回值分配给一个引用变量a
。
如何声明使用正确的数据类型?
我试过,
vector<int>::const_reference &a = vec.front();
但这句话是什么意思?
我可以先使用正确的数据类型声明变量 a 然后使用
a = vec.front();
将 vec.front() 的返回值赋给变量a
? 如果是,那我应该写什么?
我可以先使用正确的数据类型声明变量 a 然后使用
a = vec.front();
将 vec.front() 的返回值赋给变量
a
a
不是正常变量; 它是一个引用,声明一个引用而不说明它所指的是什么是不合法的:
const int& a; // Illegal
声明引用后,对变量执行的所有操作实际上都是对其引用的值执行,因此您永远无法更改引用引用的内容。
const int& a = b;
a = 10; // Changed the value of b.
我试过了,
vector<int>::const_reference &a = vec.front();
这似乎是一种过于冗长的说法:
const int& a = vec.front();
vec.front()
返回对向量前元素的引用。 const int& a = vec.front()
声明变量a
使其成为对向量前元素的引用。
这通过承诺只读值来避免复制。
如果你说:
int a = vec.front();
a
现在是数组第一个元素的副本,但您可以自由更改它。
在 int 的情况下,没有性能优势。 但是,如果您的向量是string
s 的向量,则引用将避免复制字符串,如果您不打算修改内容,这可能比引用具有显着的性能优势。
std::string str = "hello world, this is a long string.";
const std::string& a = str; // Reference, no copy
std::string b = str; // Copy of str, takes extra effort
vector::front()
返回对向量中第一个元素的引用。 因此,您可以声明存储在向量中的类型的引用,也可以使用向量类中定义的类型( vector<int>::reference
或vector<int>::const_reference
)来声明引用。
vector <int> v1;
v1.push_back(10);
v1.push_back(11);
vector<int>::reference var1 = v1.front( ); // Returns a reference to the first element you can modify or
int& x = v1.front(); // returns a reference to the first element you can modify
.....
vector<int>::const_reference var2 = v1.front(); // Returns a reference to the first element you can't modify
const int& y = v1.front(); // Return a reference to the first element you can't modify
我可以先使用正确的数据类型声明变量 a 然后使用
不可以。由于您要声明引用,因此必须在声明期间对其进行初始化。
还有一件事:
vector<int>::const_reference &a=v1.front(); // This will not compile, because you are trying to take a reference of a reference
除了@kfsone 的好答案之外,还有一个(让我说)技巧可以做类似于您所要求的事情。
我会做所有事情,但我在下面向您展示的内容。
无论如何,为了完整起见,如果您有一个reference_wrapper
,您实际上可以将它重新绑定到与您用来创建它的引用不同的引用。
这意味着您可以按照您的要求创建一个类似 object 的引用以供稍后使用。
这是一个最小的工作示例:
#include<functional>
#include<vector>
#include<cassert>
int main() {
int x;
std::reference_wrapper<int> w{x};
std::vector<int> vec{1, 2, 3};
w = vec[0];
w.get() = 42;
assert(vec[0] == 42);
}
再次,这是为了好奇。
我不建议你在你的代码中这样做(当然,除非你讨厌你的同事)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.