繁体   English   中英

如何使用const_reference类型声明一个变量并赋值给它,front()函数的返回值

[英]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>::referencevector<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.

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