5

假设我有一个整数队列,

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


int main() {

    int firstValToBePushed = 1;

    queue<int> CheckoutLine;

    CheckoutLine.push(firstValeToBePushed);

    cout << CheckoutLine.front();

    return 0;
}

我怎样才能使用包含指向整数的指针的队列来做本质上相同的事情,而不是像上面当前所做的那样。我计划制作一个循环来产生多个值,但这只是一个更简单的例子。

谢谢,

4

4 回答 4

5

如果这是为了终身管理,那么:

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

如果您的队列有点像代理,并且其他人实际上拥有对象的生命周期,那么肯定:

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

如果您没有在任何地方公开队列并且它是内部的,那么存储指针就可以了,正如其他人所建议的那样。

但是,永远不要向客户公开指针的集合,这是最糟糕的事情,因为您将管理生命周期的负担留给了它们,而这对集合来说更麻烦。

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

#include <functional>std::reference_wrapper#include <memory>std::shared_ptrstd::unique_ptr朋友。我假设您可以使用现代编译器。

于 2012-12-06T08:07:15.977 回答
3

为您添加一个循环。

#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;
}
于 2012-12-06T08:08:39.620 回答
1
#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;

}
于 2012-12-06T08:05:49.143 回答
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;
}
于 2012-12-06T08:06:50.700 回答