如何存储queue :: front返回的值?

时间:2018-01-29 17:24:19

标签: c++ pointers reference queue return-type

我不确定如何使用front()库中std::queue函数返回的值。在网站cplusplus.com上,它说该函数返回引用。 但是,当我查看实际用法时,似乎函数直接用于获取

例如,按照以下步骤

std::queue<int> myqueue;
myqueue.push(30);

返回值应存储如下:

int &some_number  = myqueue.front();

那怎么可能呢:

std::cout << "myqueue.front() returns " << myqueue.front() 
//myqueue.front() returns 30

如果它将引用返回到值,则表示它返回存储该值的位置,和不是价值本身?那么如何打印位置打印出的值不是整数的地址。

另外,遵循这个逻辑,这是否意味着它们也有效?

情景1

std::queue<int> myqueue;
myqueue.push(30);
int new_number = myqueue.front();

new_number的值为30

场景2 - (someStruct是一个已定义的结构)

std::queue<someStruct*> myqueue;
myqueue.push(someStruct* abcPtr); \\abcPtr has been initialized 
someStruct* edfPtr= myqueue.front();

edfPtr将指向abcPtr同一位置。

如果是这样,那么传递std::queue::front返回的值作为参考是什么意思。有谁知道使用背后的逻辑?

2 个答案:

答案 0 :(得分:1)

它确实返回一个引用,但是(就像其他情况一样)如果从引用赋予该类型的普通对象,则会引用引用引用的对象。

int a = 1;
int &ra = a; // reference to a

int b = ra;  // initializes `b` to the value referred to by `ra`--1 in this case.

front()的特定情况下,如果您存储的值很大,您可能希望避免创建额外的副本。在这种情况下,您可以直接使用引用,或者使用它来初始化另一个引用以获取队列中值的别名,这样您就可以在不创建副本的情况下使用它。

class something_big {
    // lots of data here
};

std::queue<something_big> foo;

something_big bar = foo.front(); // copies entire item from front of queue into bar

something_big &baz = foo.front(); // no copy; just access item in queue

答案 1 :(得分:0)

返回引用的逻辑是避免复制,除非必要。如果队列(而不是整数或指针)包含更重的东西,比如大型结构或大型向量。

int math_on_large_vector(const std::vector<int>& data) {
    // ...
}

std::queue<std::vector<int>> myqueue;
myqueue.emplace(std::vector<int>(10000, 0));
math_on_large_vector(myqueue.front()) // Doesn't copy the entire vector

如果要复制队列前面的对象,只需调用复制构造函数或赋值。

std::vector<int> local_copy(my_queue.front());

local_copy = my_queue.front();

这对于像int或指针这样的东西并不重要,但它确实适用于复制费用昂贵的东西。