52 votes

supprimer unique_ptr de la file d'attente

J'essaie de comprendre comment / si je peux utiliser unique_ptr en queue .

 // create queue
std::queue<std::unique_ptr<int>> q;

// add element
std::unique_ptr<int> p (new int{123});
q.push(std::move(p));

// try to grab the element
auto p2 = foo_queue.front();
q.pop(); 
 

Je comprends pourquoi le code ci-dessus ne fonctionne pas. Étant donné que front & pop sont deux étapes distinctes, l'élément ne peut pas être déplacé. Y a-t-il un moyen de faire cela?

73voto

ybungalobill Points 31467

Vous devez indiquer explicitement que vous souhaitez déplacer le pointeur hors de la file d'attente . Comme ça:

 std::unique_ptr<int> p2 = std::move(q.front());
q.pop();
 

0voto

Piyush Kansal Points 303
 #include <iostream>
#include <iomanip>
#include <memory>
#include <queue>

using namespace std;

class A {
    public:
        void fun() {cout << "Hello" << endl;}
};

typedef unique_ptr<A> Ptr;

int main() {
    Ptr p(new A), p2(new A);
    queue<Ptr> q;

    q.push(move(p));
    q.push(move(p2));

    q.front()->fun();
    Ptr p3 = move(q.front());
    cout << "First pointer val: " << p3.get() << endl;
    q.pop();

    cout << q.front().get() << endl;
    p3 = move(q.front());
    cout << "Second pointer val: " << p3.get() << endl;
    q.pop();

    return 0;
}
 

La sortie de ce programme sur g ++ 4.6 est:

 Hello
First pointer val: 0x1f4c010
0x1f4c030
Second pointer val: 0x1f4c030
 

Ainsi, comme mentionné par d'autres, je ne vois pas de mal à utiliser q.front () directement au lieu de déplacer d'abord sa propriété sur un autre pointeur. Est-ce que j'ai râté quelque chose?

Merci.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X