如何在队列中存储一个位于向量

时间:2015-09-17 14:47:24

标签: c++ c++11 vector queue unique-ptr

所以我正在构建一个模拟器,以模拟一些负载平衡算法。我创建了2个Cores和Dispatchers向量,如下所示:

std::vector<std::unique_ptr<Dispatcher> > vDisp;
std::vector<std::unique_ptr<Core> > vCore;

类调度程序具有核心队列,以便为其分配作业。

std::queue<Core> disp_core_queue; 

另外,我有一些函数来处理这个队列:

void add_core_q(Core& p){ disp_core_queue.push(p); }
Core get_core_q(){ return disp_core_queue.front(); }

当程序初始化时,我填充核心和disps如下:

for (auto i=0; i<dispNumb; ++i)
{
    vDisp.push_back(std::unique_ptr<Dispatcher> (new Dispatcher));
    std::cout<<"Disp n."<<i<<" Created"<<std::endl;
}

我的问题是我无法从向量中获取Core并将其存储在Dispatcher的队列中。我尝试了很多方法,但似乎C ++因各种原因惩罚我。我最后一次尝试是来自Dispatcher的这个:

    int kore = random_core();
    this->add_core_q(vCore.at(kore));

在编译时出现了这个错误:

错误:没有匹配函数来调用'Dispatcher :: add_core_q(_gnu_cxx :: __ alloc_traits&gt;&gt; :: value_type&amp;)'

候选人是:

void Dispatcher :: add_core_q(Core&amp;)

来自'__gnu_cxx :: __ alloc_traits&gt;的参数1没有已知转换&gt; :: value_type {aka std :: unique_ptr}''核心&amp;'

如果有人能给我一个提示,我会非常感激。提前谢谢。

2 个答案:

答案 0 :(得分:0)

add_core_q的函数签名正在使用Core&amp;。 您正在传递std :: unique_ptr。

答案 1 :(得分:0)

您的Core对象存储在unique_ptr中,但您的add_core_q方法需要Core引用。

您可以从unique_ptr获取原始指针并取消引用它,这将允许您执行此操作:

add_core_q(*(vCore[0]));

但是你也会遇到get_core_q方法的问题,因为它返回Core对象的副本,而不是对unique_ptr中存储的Core的引用。

就个人而言,我只是传递指针而不是解除引用。因此,您需要更改add_core_q方法以接受原始指针:

void add_core_q(Core* p){ disp_core_queue.push(p); }

您可以这样使用:

add_core_q(vCore[0].get());

您还必须更改队列以存储指针而不是对象本身:

std::queue<Core*> disp_core_queue;

您需要将get方法的返回类型更改为指针。

Core* get_core_q(){ return disp_core_queue.front(); }

虽然如果你对参考文献更熟悉,你可以返回一个参考文献:

Core& get_core_q(){ return *(disp_core_queue.front()); }