Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将向量作为引用传递给Std::Tuple并对其进行修改_C++_C++14_Std_Pass By Reference_Stdvector - Fatal编程技术网

C++ 将向量作为引用传递给Std::Tuple并对其进行修改

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

我试图在优先级队列中使用元组,并且元组包含向量。我希望能够修改这些向量,但当我从向量中删除项目时,它不会更改实际内容。我认为我正在修改值而不是引用,但是我对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());
使用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&