Vs2005 C++ Heap使用push_head()异常invalid Heap(bug)

最近想使用STL的heap,我的vs2005 Team Edition For Software Developers版本是version
8.0.50727.42,.Net Framework Version 2.0.50727 .

然后看到微软官网的一段使用Heap的代码

  1. // alg_push_heap.cpp
  2. // compile with: /EHsc
  3. #include 
  4. #include 
  5. #include 
  6. #include 
    1. int main( ) {
  7. using namespace std;
  8. vector < int > v1, v2;
  9. vector < int >::iterator Iter1, Iter2;
    1. int i;
  10. for ( i = 1 ; i <= 9 ; i++ )
  11. v1.push_back( i );
    1. random_shuffle( v1.begin( ), v1.end( ) );
    1. cout << "Vector v1 is ( " ;
  12. for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
  13. cout << *Iter1 << " " ;
  14. cout << “).” << endl;
    1. // Make v1 a heap with default less than ordering
  15. make_heap ( v1.begin( ), v1.end( ) );
  16. cout << "The heaped version of vector v1 is ( " ;
  17. for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
  18. cout << *Iter1 << " " ;
  19. cout << “).” << endl;
    1. // Add an element to the heap
  20. v1.push_back( 10 );
  21. cout << "The heap v1 with 10 pushed back is ( " ;
  22. for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
  23. cout << *Iter1 << " " ;
  24. cout << “).” << endl;
    1. push_heap( v1.begin( ), v1.end( ) );
  25. cout << "The reheaped v1 with 10 added is ( " ;
  26. for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
  27. cout << *Iter1 << " " ;
  28. cout << “).” << endl << endl;
    1. // Make v1 a heap with greater than ordering
  29. make_heap ( v1.begin( ), v1.end( ), greater< int >( ) );
  30. cout << "The greater-than heaped version of v1 is/n ( " ;
  31. for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
  32. cout << *Iter1 << " " ;
  33. cout << “).” << endl;
    1. v1.push_back(0);
  34. cout << "The greater-than heap v1 with 11 pushed back is/n ( " ;
  35. for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
  36. cout << *Iter1 << " " ;
  37. cout << “).” << endl;
    1. push_heap( v1.begin( ), v1.end( ), greater< int >( ) );
  38. cout << "The greater than reheaped v1 with 11 added is/n ( " ;
  39. for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
  40. cout << *Iter1 << " " ;
  41. cout << “).” << endl;
  42. }

发现竟然在push_heap()那里抛了异常。(invalid Heap)

然后无奈去了 www.cplusplus.com 也下了一段代码:

  1. // range heap example
  2. #include 
  3. #include 
  4. #include 
  5. using namespace std;
    1. int main () {
  6. int myints[] = {10,20,30,5,15};
  7. vector< int > v(myints,myints+5);
  8. vector< int >::iterator it;
    1. make_heap (v.begin(),v.end());
  9. cout << "initial max heap   : " << v.front() << endl;
    1. pop_heap (v.begin(),v.end()); v.pop_back();
  10. cout << "max heap after pop : " << v.front() << endl;
    1. v.push_back(99); push_heap (v.begin(),v.end());
  11. cout << "max heap after push: " << v.front() << endl;
    1. sort_heap (v.begin(),v.end());
    1. cout << “final sorted range :” ;
  12. for (unsigned i=0; i<v.size(); i++) cout << " " << v[i];
    1. cout << endl;
    1. return 0;
  13. }

这段代码没有抛异常,运行完好。仔细检查一番,发现可能是vector数组中的元素没有增多的缘故。于是将

pop_heap (v.begin(),v.end()); v.pop_back();改为

pop_heap (v.begin(),v.end()); 这样vector元素就在总数上多了一。

然后运行…相同的错误。

不知道vs2008版本上有没有相同的错误。