首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用const_reference类型声明变量并为其赋值-- front()函数的返回值

如何使用const_reference类型声明变量并为其赋值-- front()函数的返回值
EN

Stack Overflow用户
提问于 2016-04-23 19:57:17
回答 3查看 1.4K关注 0票数 2

我声明了一个向量并用三个值初始化它,

代码语言:javascript
运行
复制
vector<int> vec{1, 2, 3};

我尝试将vec.front()的返回值赋值给一个引用变量a

如何声明使用正确的数据类型?

我试过了

代码语言:javascript
运行
复制
vector<int>::const_reference &a = vec.front();           

但这句话意味着什么呢?

我是否可以先使用正确的数据类型声明变量a,然后使用

代码语言:javascript
运行
复制
a = vec.front();

将vec.front()的返回值赋给变量a?如果是,那我该写什么呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-04-23 20:03:08

我是否可以先使用正确的数据类型声明变量a,然后使用

a = vec.front();

将vec.front()的返回值赋值给变量a

a不是一个普通变量;它是一个引用,声明引用而不声明它引用的内容是不合法的:

代码语言:javascript
运行
复制
const int& a;  // Illegal

一旦声明了引用,在变量上执行的所有操作实际上都是在它引用的值上执行的,因此您永远不能更改引用引用。

代码语言:javascript
运行
复制
const int& a = b;
a = 10;  // Changed the value of b.

我试过了,vector<int>::const_reference &a = vec.front();

这似乎是一种过于冗长的说法:

代码语言:javascript
运行
复制
const int& a = vec.front();

vec.front()返回对向量前端元素的引用。const int& a = vec.front()声明变量a,因此它是对向量的前端元素的引用。

这样就避免了复制,因为它承诺只读取值。

如果你说:

代码语言:javascript
运行
复制
int a = vec.front();

a现在将是数组的第一个元素的副本,但是您可以自由地更改它。

在int的情况下,没有性能优势。但是,如果您的向量是string的向量,则使用引用可以避免复制字符串,如果您不打算修改内容,这将大大提高引用的性能。

代码语言:javascript
运行
复制
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
票数 2
EN

Stack Overflow用户

发布于 2016-04-23 20:01:51

vector::front()返回对向量中第一个元素的引用。因此,您可以声明存储在向量中的类型的引用,也可以使用向量类中定义的类型(vector<int>::referencevector<int>::const_reference)来声明引用。

代码语言:javascript
运行
复制
   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,然后使用

不是的。由于您正在声明引用,因此必须在声明期间初始化它。

还有一件事:

代码语言:javascript
运行
复制
    vector<int>::const_reference &a=v1.front(); // This will not compile, because you are trying to take a reference of a reference
票数 1
EN

Stack Overflow用户

发布于 2016-04-23 20:21:15

除了@kfsone的好答案外,还有一个(让我说)技巧来做一些与您要求的类似的事情。

我什么都愿意做,但下面给你看的是。

无论如何,为了完整起见,如果您有一个reference_wrapper,您实际上可以将它重新绑定到与创建它的引用不同的引用。

这意味着您可以按照您的要求创建一个类似于引用的对象,以便稍后使用。

下面是一个最小的工作示例:

代码语言:javascript
运行
复制
#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);
}

再说一次,这是出于好奇。

我不建议您在代码中这样做(当然,除非您讨厌您的同事)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36815724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档