C++ 将向量作为引用传递给Std::Tuple并对其进行修改
我试图在优先级队列中使用元组,并且元组包含向量。我希望能够修改这些向量,但当我从向量中删除项目时,它不会更改实际内容。我认为我正在修改值而不是引用,但是我对C++并不是很有经验,需要一些帮助来修复这个代码: 我这样定义元组:C++ 将向量作为引用传递给Std::Tuple并对其进行修改,c++,c++14,std,pass-by-reference,stdvector,C++,C++14,Std,Pass By Reference,Stdvector,我试图在优先级队列中使用元组,并且元组包含向量。我希望能够修改这些向量,但当我从向量中删除项目时,它不会更改实际内容。我认为我正在修改值而不是引用,但是我对C++并不是很有经验,需要一些帮助来修复这个代码: 我这样定义元组: using tuple_type = std::tuple<std::vector<uint64_t>, File*, size_t>; auto comparator = [](tuple_type const &a, tupl
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());
使用tuple\u type=std::tuple;
自动比较器=[](元组类型常量和a,元组类型常量和b){
返回std::get(a.front()>std::get(b.front();
};
优先级队列pq{comparator};
我这样访问它们:
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());
auto elem=pq.top();
auto*file=std::get(elem);
自动块包含最小元素=std::get(elem);
写入。向后推(包含最小元素的块);
包含最小元素的块。擦除(包含最小元素的块。开始());
我删除了第一个元素,但在下一次迭代中,它仍然存在。我尝试使用包含最小元素的std::get(elem)=block_来编写元组,但也不起作用
提前谢谢
我想我是在修改值而不是引用
这是对问题的正确诊断
正如在评论中指出的,另一个问题是不能直接修改std::priority_队列中的元素。你必须:
按值获取元素
修改元素
从队列中弹出元素
将元素推送到队列中
使用
auto elem=pq.top();
auto*file=std::get(elem);
包含最小元素=std::get(elem)的auto&block\u;
写入。向后推(包含最小元素的块);
包含最小元素的块。擦除(包含最小元素的块。开始());
pq.pop();
电能质量推动(elem);
我想我是在修改值而不是引用
这是对问题的正确诊断
正如在评论中指出的,另一个问题是不能直接修改std::priority_队列中的元素。你必须:
按值获取元素
修改元素
从队列中弹出元素
将元素推送到队列中
使用
auto elem=pq.top();
auto*file=std::get(elem);
包含最小元素=std::get(elem)的auto&block\u;
写入。向后推(包含最小元素的块);
包含最小元素的块。擦除(包含最小元素的块。开始());
pq.pop();
电能质量推动(elem);
原因很清楚,因为实际元素在优先级队列中,而不是在自动变量中。如果您看到这一行代码:
auto block_containing_smallest_element = std::get<0>(elem);
这里您只是从变量中删除一个变量!!,在这里,您需要给出以下信息:
auto& elem = pq.top();
auto *file = std::get<1>(elem);
auto& block_containing_smallest_element = std::get<0>(elem);
auto&elem=pq.top();
auto*file=std::get(elem);
包含最小元素=std::get(elem)的auto&block\u;
还请记住,它是一个优先级队列,因此即使从变量中删除元素,它也会影响实际元素,因为它不指向原始PQ,原因很清楚,因为实际元素在优先级队列中,而不是在自动变量中。如果您看到这一行代码:
auto block_containing_smallest_element = std::get<0>(elem);
这里您只是从变量中删除一个变量!!,在这里,您需要给出以下信息:
auto& elem = pq.top();
auto *file = std::get<1>(elem);
auto& block_containing_smallest_element = std::get<0>(elem);
auto&elem=pq.top();
auto*file=std::get(elem);
包含最小元素=std::get(elem)的auto&block\u;
还请记住,它是一个优先级队列,因此即使您从变量中删除一个元素,它也会影响实际的元素,因为它不指向原始PQ(不直接相关),但不允许您修改std::priority_队列
中的元素。2) 经验法则:auto
从来都不是引用。1)没有直接关系,但不允许修改std::priority\u队列中的元素。2) 经验法则:auto
永远不是参考。谢谢。我修改了代码,但现在带有.erase的行出现以下编译错误:没有匹配的成员函数用于调用“erase”候选函数不可行:“this”参数的类型为“const std::vector”,但方法未标记为const候选函数不可行:需要2个参数,但提供了1个参数。你也可以帮我:)这段代码,后面是包含最小元素的block。erase()
不应该编译std::priority\u queue::top()
返回常量引用。@erinc,您不能修改std::priority\u队列中的元素。弹出元素,修改它,然后将其推回。谢谢@Evg。我是新的C++,特别是现代的特点,所以我挣扎了一点。我会记住这些:)谢谢。我修改了代码,但现在带有.erase的行出现以下编译错误:没有匹配的成员函数用于调用“erase”候选函数不可行:“this”参数的类型为“const std::vector”,但方法未标记为const候选函数不可行:需要2个参数,但提供了1个参数。你也可以帮我:)这段代码,后面是包含最小元素的block。erase()
不应该编译std::priority\u queue::top()
返回常量引用。@erinc,您不能修改std::priority\u队列中的元素。弹出元素,修改它,然后将其推回。谢谢@Evg。我是新的C++,特别是现代的特点,所以我挣扎了一点。我会记住这些:)我不明白这个答案想要表达什么。OP不想从优先级队列中删除元素,而想从优先级队列的元素中删除元素。明白你的意思了,用auto&
更新了应答。如果erase()
应用于包含最小元素的块,则此代码不会编译,因为auto&