Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.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::push_堆和std::pop_堆_C++_C++11_Stl_Heap_Move Semantics - Fatal编程技术网

C++ 具有可移动可构造对象的std::push_堆和std::pop_堆

C++ 具有可移动可构造对象的std::push_堆和std::pop_堆,c++,c++11,stl,heap,move-semantics,C++,C++11,Stl,Heap,Move Semantics,我想维护一个堆,其中有效负载是可移动的(因为它们内部有一个std::unique_ptr),尽管建议对象必须是,但这样做会在GCC和Clang中引发错误 示例代码 我还没有使用std::unique_ptr,只是禁用了相应的复制操作符): #包括 #包括 #包括 结构数据{ 显式数据(int值):值(value){} int值; 布尔算子d值; } /** *注释掉此结构的其余部分 *获取通过使用复制运算符/ctor工作的代码。 */ 显式数据(const Data&d)=删除; 数据和运算符

我想维护一个堆,其中有效负载是可移动的(因为它们内部有一个
std::unique_ptr
),尽管建议对象必须是,但这样做会在GCC和Clang中引发错误

示例代码 我还没有使用
std::unique_ptr
,只是禁用了相应的复制操作符):

#包括
#包括
#包括
结构数据{
显式数据(int值):值(value){}
int值;
布尔算子d值;
}
/**
*注释掉此结构的其余部分
*获取通过使用复制运算符/ctor工作的代码。
*/ 
显式数据(const Data&d)=删除;
数据和运算符=(常量数据和d)=删除;
显式数据(数据和数据)=默认值;
数据和运算符=(数据和d)=默认值;
};
结构MinHeap{
无效推送(数据和d){
货柜安放(标准::移动(d));
std::push_堆(container_u.begin(),container_u.end());
}
数据Pop(){
std::pop_堆(container_u.begin(),container_u.end());
数据d=std::move(container.back());
容器u.pop_back();
返回std::移动(d);
}
size_t size()常量{return container_u.size();}
bool empty()常量{return size()==0;}
私人:
std::向量容器;
};
int main(){
Minh;
h、 推送(数据(5));
h、 推送(数据(8));
h、 推送(数据(11));
h、 推送(数据(3));
h、 推送(数据(7));
而(!h.empty()){
数据d=std::move(h.Pop());

std::cout永远不要将复制构造函数或移动构造函数标记为显式的。这并不违法。它只是不寻常到令人困惑。它没有好处,只有缺点


移动构造函数上的
显式
是导致此错误的原因。

永远不要将复制构造函数或移动构造函数标记为
显式
。这并不违法。它非常不寻常,足以令人困惑。它没有好处,只有缺点


移动构造函数上的
显式
是导致此错误的原因。

永远不要将复制构造函数或移动构造函数标记为
显式
。这并不违法。它非常不寻常,足以令人困惑。它没有好处,只有缺点


移动构造函数上的
显式
是导致此错误的原因。

永远不要将复制构造函数或移动构造函数标记为
显式
。这并不违法。它非常不寻常,足以令人困惑。它没有好处,只有缺点



移动构造函数上的
explicit
是导致此错误的原因。

带有
explicit
move构造函数的类型不满足
MoveConstructible
。谢谢。是的,这解决了问题。虽然我看到您最初的问题已经解决,但您应该注意一些事情。对push_堆的要求只是veconstructable/Assignable,是的。但是你也在向量上做一个emplace_。vector有一个更复杂的要求:你要么需要一个noexcept move构造函数/move assignment,要么需要一个copy构造函数。你的例子之所以有效,是因为默认生成的move函数是no except(在本例中);如果您自己编写,则需要显式使用noexcept(请注意,unique_ptr满足此要求).Thank@Nirfiedman。我知道这个问题,但感谢你指出。带有
显式
移动构造函数的类型不满足
移动可构造的
。谢谢。是的,这解决了问题。虽然我看到你最初的问题已经解决,但有一些事情你应该注意。推送堆的要求只是MoveCon可构造/可分配,是的。但您也在向量上进行定位。向量有一个更复杂的要求:您需要一个noexcept move构造函数/move assignment,或者一个副本构造函数。您的示例之所以有效,是因为默认生成的move函数是no except(在本例中);如果您自己编写,则需要显式使用noexcept(请注意,unique_ptr满足此要求).Thank@Nirfiedman。我知道这个问题,但感谢你指出。带有
显式
移动构造函数的类型不满足
移动可构造的
。谢谢。是的,这解决了问题。虽然我看到你最初的问题已经解决,但有一些事情你应该注意。推送堆的要求只是MoveCon可构造/可分配,是的。但您也在向量上进行定位。向量有一个更复杂的要求:您需要一个noexcept move构造函数/move assignment,或者一个副本构造函数。您的示例之所以有效,是因为默认生成的move函数是no except(在本例中);如果您自己编写,则需要显式使用noexcept(请注意,unique_ptr满足此要求).Thank@Nirfiedman。我知道这个问题,但感谢你指出。带有
显式
移动构造函数的类型不满足
移动可构造的
。谢谢。是的,这解决了问题。虽然我看到你最初的问题已经解决,但有一些事情你应该注意。推送堆的要求只是MoveCon可构造/可分配,是的。但您也在向量上进行定位。向量有一个更复杂的要求:您需要一个noexcept move构造函数/move assignment,或者一个副本构造函数。您的示例之所以有效,是因为默认生成的move函数是no except(在本例中);如果您自己编写,则需要显式使用noexcept(请注意,unique_ptr满足此要求)。谢谢@Nirfiedman。我知道这个问题,但谢谢你指出。谢谢。是的,删除
显式
会让它重新工作。谢谢。是的,删除
显式
会让它重新工作。谢谢。是的,删除
显式
会让它重新工作。谢谢。是的,删除
显式
会让它重新工作阿加
#include <iostream>
#include <vector>
#include <algorithm>

struct Data {
  explicit Data(int value) : value(value) {}
  int value;

  bool operator<(const Data& d) const {
      return value > d.value;
  }

  /**
    * Commenting out the rest of the section for this struct
    * gets the code working by using copy operator/ctor.
    */ 
  explicit Data(const Data& d) = delete;
  Data& operator=(const Data& d) = delete;

  explicit Data(Data&& d) = default;
  Data& operator=(Data&& d) = default;    
};

struct MinHeap {
  void Push(Data&& d) {
    container_.emplace_back(std::move(d));
    std::push_heap(container_.begin(), container_.end());
  }

  Data Pop() {
    std::pop_heap(container_.begin(), container_.end());
    Data d = std::move(container_.back());
    container_.pop_back();
    return std::move(d);
  }

  size_t size() const { return container_.size(); }
  bool empty() const { return size() == 0; }

 private:
  std::vector<Data> container_;
};

int main() {
    MinHeap h;
    h.Push(Data(5));
    h.Push(Data(8));
    h.Push(Data(11));
    h.Push(Data(3));
    h.Push(Data(7));

    while (!h.empty()) {
        Data d = std::move(h.Pop());
        std::cout << d.value << std::endl;
    }
    return 0;
}
In file included from /usr/include/c++/4.9.2/bits/stl_pair.h:59:0,                                                                   
                 from /usr/include/c++/4.9.2/bits/stl_algobase.h:64,                                                                 
                 from /usr/include/c++/4.9.2/bits/char_traits.h:39,                                                                  
                 from /usr/include/c++/4.9.2/ios:40,                                                                                 
                 from /usr/include/c++/4.9.2/ostream:38,                                                                             
                 from /usr/include/c++/4.9.2/iostream:39,                                                                            
                 from main.cpp:1:                                                                                                    
/usr/include/c++/4.9.2/bits/stl_heap.h: In instantiation of 'void std::push_heap(_RAIter, _RAIter) [with _RAIter = __gnu_cxx::__norma
l_iterator<Data*, std::vector<Data> >]':                                                                                             
main.cpp:25:56:   required from here                                                                                                 
/usr/include/c++/4.9.2/bits/stl_heap.h:164:28: error: no matching function for call to 'Data::Data(std::remove_reference<Data&>::type
)'                                                                                                                                   
       _ValueType __value = _GLIBCXX_MOVE(*(__last - 1));                                                                            
                            ^                                                                                                        
In file included from /usr/include/c++/4.9.2/bits/stl_algo.h:61:0,                                                                   
                 from /usr/include/c++/4.9.2/algorithm:62,                                                                           
                 from main.cpp:3:                                                                                                    
/usr/include/c++/4.9.2/bits/stl_heap.h:167:45: error: no matching function for call to 'Data::Data(std::remove_reference<Data&>::type
)'                                                                                                                                   
          __gnu_cxx::__ops::__iter_less_val());                                                                                      
                                             ^                                                                                       
/usr/include/c++/4.9.2/bits/stl_heap.h:124:5: error:   initializing argument 4 of 'void std::__push_heap(_RandomAccessIterator, _Dist
ance, _Distance, _Tp, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<Data*, std::vector<Data> >; _Distance = lo
ng int; _Tp = Data; _Compare = __gnu_cxx::__ops::_Iter_less_val]'                                                                    
     __push_heap(_RandomAccessIterator __first,                                                                                      
     ^                                                                                                                               
In file included from /usr/include/c++/4.9.2/bits/stl_pair.h:59:0,                                                                   
                 from /usr/include/c++/4.9.2/bits/stl_algobase.h:64,                                                                 
                 from /usr/include/c++/4.9.2/bits/char_traits.h:39,                                                                  
                 from /usr/include/c++/4.9.2/ios:40,                                                                                 
                 from /usr/include/c++/4.9.2/ostream:38,                                                                             
                 from /usr/include/c++/4.9.2/iostream:39,                                                                            
                 from main.cpp:1:                                                                                                    
/usr/include/c++/4.9.2/bits/stl_heap.h: In instantiation of 'void std::__pop_heap(_RandomAccessIterator, _RandomAccessIterator, _Rand
omAccessIterator, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<Data*, std::vector<Data> >; _Compare = __gnu_c
xx::__ops::_Iter_less_iter]':                                                                                                        
/usr/include/c++/4.9.2/bits/stl_heap.h:280:42:   required from 'void std::pop_heap(_RAIter, _RAIter) [with _RAIter = __gnu_cxx::__nor
mal_iterator<Data*, std::vector<Data> >]'                                                                                            
main.cpp:29:55:   required from here                                                                                                 
/usr/include/c++/4.9.2/bits/stl_heap.h:243:28: error: no matching function for call to 'Data::Data(std::remove_reference<Data&>::type
)'                                                                                                                                   
       _ValueType __value = _GLIBCXX_MOVE(*__result);                                                                                
                            ^                                                                                                        
In file included from /usr/include/c++/4.9.2/bits/stl_algo.h:61:0,                                                                   
                 from /usr/include/c++/4.9.2/algorithm:62,                                                                           
                 from main.cpp:3:                                                                                                    
/usr/include/c++/4.9.2/bits/stl_heap.h:247:35: error: no matching function for call to 'Data::Data(std::remove_reference<Data&>::type
)'                                                                                                                                   
     _GLIBCXX_MOVE(__value), __comp);                                                                                                
                                   ^                                                                                                 
/usr/include/c++/4.9.2/bits/stl_heap.h:207:5: error:   initializing argument 4 of 'void std::__adjust_heap(_RandomAccessIterator, _Di
stance, _Distance, _Tp, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<Data*, std::vector<Data> >; _Distance = 
long int; _Tp = Data; _Compare = __gnu_cxx::__ops::_Iter_less_iter]'                                                                 
     __adjust_heap(_RandomAccessIterator __first, _Distance __holeIndex,                                                             
     ^