【问题标题】:How to store values returned by queue::front?如何存储 queue::front 返回的值?
【发布时间】:2018-01-29 17:24:18
【问题描述】:

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

例如,通过以下步骤

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

返回值应按如下方式存储:

int &some_number  = myqueue.front();

那么这怎么可能:

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

如果它返回 reference 值,这是否意味着它返回 位置 存储值的位置,而不是 不是值本身强>?那么打印位置怎么会打印出值而不是整数的地址。

另外,按照这个逻辑,是不是意味着这些也有效?

场景 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 返回的值作为参考有什么意义。有谁知道使用背后的逻辑?

【问题讨论】:

  • 不要将引用视为指针,将其视为别名同义词。看到这个:stackoverflow.com/q/620604/10077
  • 我明白了。那么这是否意味着这样做&amp;some_int =... 不会改变some_int 指向的位置,而只会改变它的值?

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


【解决方案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

【讨论】:

  • 这是否意味着这样做&amp;some_int =3 不会改变some_int 的位置,而只会改变它的值?而这样做&amp;some_ptr =another_ptr(为指针的引用赋值)只会改变some_ptr指向的位置?也相当于写some_ptr =another_ptr
【解决方案2】:

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

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 或指针之类的东西并不重要,但对于复制成本高昂的东西却很重要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多