首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将向量作为对Std::Tuple的引用并修改它

将向量作为对Std::Tuple的引用并修改它
EN

Stack Overflow用户
提问于 2021-05-03 18:07:08
回答 2查看 134关注 0票数 0

我试图在priority_queue中使用元组,而我的元组包含向量。我希望能够修改这些向量,但是当我从向量中删除项目时,它不会改变实际的内容。我认为我是在修改值而不是引用,但我对c++并不十分熟悉,需要在修复这段代码方面提供一些帮助:

我定义我的元组如下:

代码语言:javascript
复制
   using tuple_type = std::tuple<std::vector<uint64_t>, File*, size_t>;
   auto comparator = [](tuple_type const &a, tuple_type const &b) {
      return std::get<0>(a).front()> std::get<0>(b).front();
   };

   std::priority_queue<tuple_type, std::vector<tuple_type>, decltype(comparator)> pq{comparator};

我像这样访问他们:

代码语言:javascript
复制
      auto elem = pq.top();
      auto *file = std::get<1>(elem);
      auto block_containing_smallest_element = std::get<0>(elem);
      to_write.push_back(block_containing_smallest_element.front());
      block_containing_smallest_element.erase(block_containing_smallest_element.begin());

我删除了第一个元素,但是在下一个迭代中,它仍然存在。我尝试使用std::get<0>(elem) = block_containing_smallest_element编写元组,但它也没有工作。

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-03 18:12:56

我想我是在修改值而不是引用

这是对问题的正确诊断。

正如注释中指出的那样,另一个问题是不能直接修改std::priority_queue中的修改元素。你必须:

  1. 按值获取元素。
  2. 修改元素。
  3. 从队列中弹出元素。
  4. 将元素推到队列中。

G 212

使用

代码语言:javascript
复制
auto elem = pq.top();
auto *file = std::get<1>(elem);
auto& block_containing_smallest_element = std::get<0>(elem);
to_write.push_back(block_containing_smallest_element.front());
block_containing_smallest_element.erase(block_containing_smallest_element.begin());
pq.pop();
pq.push(elem);
票数 2
EN

Stack Overflow用户

发布于 2021-05-03 18:36:54

原因很清楚,因为实际元素在优先级队列中,而不是在auto变量中。如果您看到这一行代码:

代码语言:javascript
复制
auto block_containing_smallest_element = std::get<0>(elem);

在这里,创建了一个新变量,它的类型是auto,这样c++就可以自己计算出类型,但是当您在最后一行中删除它时,

代码语言:javascript
复制
block_containing_smallest_element.erase(block_containing_smallest_element.begin()); 

在这里,您只是从变量中删除一个变量!这里您需要给出如下内容:

代码语言:javascript
复制
auto& elem = pq.top();
auto *file = std::get<1>(elem);
auto& block_containing_smallest_element = std::get<0>(elem);

还请记住,它是一个PIRORITY队列,所以即使您从变量中删除了一个元素,它的工作也会影响实际的元素,因为它没有指向原始的PQ。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67373764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档