我试图在priority_queue中使用元组,而我的元组包含向量。我希望能够修改这些向量,但是当我从向量中删除项目时,它不会改变实际的内容。我认为我是在修改值而不是引用,但我对c++并不十分熟悉,需要在修复这段代码方面提供一些帮助:
我定义我的元组如下:
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};我像这样访问他们:
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编写元组,但它也没有工作。
提前谢谢。
发布于 2021-05-03 18:12:56
我想我是在修改值而不是引用
这是对问题的正确诊断。
正如注释中指出的那样,另一个问题是不能直接修改std::priority_queue中的修改元素。你必须:
G 212
使用
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);发布于 2021-05-03 18:36:54
原因很清楚,因为实际元素在优先级队列中,而不是在auto变量中。如果您看到这一行代码:
auto block_containing_smallest_element = std::get<0>(elem);在这里,创建了一个新变量,它的类型是auto,这样c++就可以自己计算出类型,但是当您在最后一行中删除它时,
block_containing_smallest_element.erase(block_containing_smallest_element.begin()); 在这里,您只是从变量中删除一个变量!这里您需要给出如下内容:
auto& elem = pq.top();
auto *file = std::get<1>(elem);
auto& block_containing_smallest_element = std::get<0>(elem);还请记住,它是一个PIRORITY队列,所以即使您从变量中删除了一个元素,它的工作也会影响实际的元素,因为它没有指向原始的PQ。
https://stackoverflow.com/questions/67373764
复制相似问题