在c ++中创建一个标准的指针队列

时间:2012-12-06 07:58:41

标签: c++ pointers queue

假设我有一个整数队列,

#include <iostream>
#include <queue>
using namespace std;


int main() {

    int firstValToBePushed = 1;

    queue<int> CheckoutLine;

    CheckoutLine.push(firstValeToBePushed);

    cout << CheckoutLine.front();

    return 0;
}

如何使用一个包含指向整数的指针的队列来完成相同的事情,而不像上面那样整数。我打算制作一个循环来制作多个值,但这只是一个更简单的例子。

谢谢,

4 个答案:

答案 0 :(得分:4)

如果那是终身管理,那么:

std::queue<std::shared_ptr<int>> CheckoutLine;
CheckoutLine.push(std::make_shared<int>(firstValeToBePushed))

如果您的队列类似于代理,而其他人实际上拥有对象的生命周期,那么肯定:

std::queue<std::reference_wrapper<int>> CheckoutLine;
CheckoutLine.push(firstValeToBePushed)

如果您没有将队列暴露在任何地方并且它是内部的,那么然后存储指针就好了,正如其他人建议的那样。

但是,永远不会向客户端公开指针集合,这是你可以做的最糟糕的事情,因为你要承担管理生命周期的负担,这对集合来说更加麻烦。 / p>

当然对于原始类型或POD,只需复制即可,无需存储指针。移动语义使得即使对于非POD也很容易,除非你有一些棘手的构造,或者你的对象无法实现移动语义。

#include <functional>的{​​{1}}和std::reference_wrapper#include <memory>和朋友的std::shared_ptr。我假设您可以访问现代编译器。

答案 1 :(得分:2)

为您添加循环。

#include <iostream>
#include <queue>
using namespace std;

int main() {

queue<int*> theQueue;
char c = 'n';

while (c == 'n') {
  cout << "Enter \'n\' to add a new number to queue ( \'q\' to quit):";
  cin >> c;
  if ( c == 'q') {
    break;
  }
  else {
    int num;
    cout << "Enter an integer and press return: ";
    cin >> num;
    theQueue.push(new int(num));
  }
}

while( !theQueue.empty() ) {
  cout << theQueue.front() << ": " << *theQueue.front() << endl;
      delete theQueue.front();
  theQueue.pop();
}
return 0;
}

答案 2 :(得分:0)

#include <iostream>
#include <queue>
using namespace std;


int main()
{
int  value = 1337;

int* firstValeToBePushed = &value;


queue<int*> CheckoutLine;



CheckoutLine.push(firstValeToBePushed);


cout << *(CheckoutLine.front()) << "is at " << CheckoutLine.front();

return 0;

}

答案 3 :(得分:0)

我不太明白,也许你想要这样做:

#include <iostream>
#include <queue>

using namespace std;

int main(){
    int firstValueToBePushed = 1;

    queue<int *> CheckoutLine;

    CheckoutLine.push(new int(firstValueToBePushed));

    cout << *CheckoutLine.front() << endl;

    return 0;
}