vs2005 c++ heap使用push_head()异常invalid heap(bug)

25 篇文章 0 订阅

最近想使用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 <vector>
  4. #include <algorithm>
  5. #include <functional>
  6. #include <iostream>
  7. int main( ) {
  8.    using namespace std;
  9.    vector <int> v1, v2;
  10.    vector <int>::iterator Iter1, Iter2;
  11.    int i;
  12.    for ( i = 1 ; i <= 9 ; i++ )
  13.       v1.push_back( i );
  14.    random_shuffle( v1.begin( ), v1.end( ) );
  15.    cout << "Vector v1 is ( " ;
  16.    for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
  17.       cout << *Iter1 << " ";
  18.    cout << ")." << endl;
  19.    // Make v1 a heap with default less than ordering
  20.    make_heap ( v1.begin( ), v1.end( ) );
  21.    cout << "The heaped version of vector v1 is ( " ;
  22.    for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
  23.       cout << *Iter1 << " ";
  24.    cout << ")." << endl;
  25.    // Add an element to the heap
  26.    v1.push_back( 10 );
  27.    cout << "The heap v1 with 10 pushed back is ( " ;
  28.    for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
  29.       cout << *Iter1 << " ";
  30.    cout << ")." << endl;
  31.    push_heap( v1.begin( ), v1.end( ) );
  32.    cout << "The reheaped v1 with 10 added is ( " ;
  33.    for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
  34.       cout << *Iter1 << " ";
  35.    cout << ")." << endl << endl;
  36.    // Make v1 a heap with greater than ordering
  37.    make_heap ( v1.begin( ), v1.end( ), greater<int>( ) );
  38.    cout << "The greater-than heaped version of v1 is/n ( " ;
  39.    for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
  40.       cout << *Iter1 << " ";
  41.    cout << ")." << endl;
  42.    v1.push_back(0);
  43.    cout << "The greater-than heap v1 with 11 pushed back is/n ( " ;
  44.    for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
  45.       cout << *Iter1 << " ";
  46.    cout << ")." << endl;
  47.    push_heap( v1.begin( ), v1.end( ), greater<int>( ) );
  48.    cout << "The greater than reheaped v1 with 11 added is/n ( " ;
  49.    for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
  50.       cout << *Iter1 << " ";
  51.    cout << ")." << endl;
  52. }

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

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

 

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

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

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

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

然后运行..相同的错误。

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

 

 

make_heappush_heap、pop_heap和sort_heap都是C++ STL库中的算法,用于操作堆(heap)数据结构。 1. make_heap:将一个无序的区间转换为堆。函数原型如下: ``` template <class RandomAccessIterator> void make_heap (RandomAccessIterator first, RandomAccessIterator last); ``` 其中,first和last分别为区间的起始和结束迭代器。make_heap函数会将[first,last)区间转换为堆。调用该函数后,该区间的最大元素会被放在第一个位置上。 2. push_heap:将一个元素添加到堆中。函数原型如下: ``` template <class RandomAccessIterator> void push_heap (RandomAccessIterator first, RandomAccessIterator last); ``` 其中,first和last分别为区间的起始和结束迭代器。当前,[first,last-1)已经是一个堆,push_heap函数将last-1位置的元素添加到堆中,并且保证该堆仍然是一个堆。 3. pop_heap:将堆的最大元素移动到末尾。函数原型如下: ``` template <class RandomAccessIterator> void pop_heap (RandomAccessIterator first, RandomAccessIterator last); ``` 其中,first和last分别为区间的起始和结束迭代器。当前,[first,last)已经是一个堆,pop_heap函数将该堆的最大元素(即first位置的元素)移动到last-1位置,并且保证[first,last-1)仍然是一个堆。 4. sort_heap:将一个堆排序。函数原型如下: ``` template <class RandomAccessIterator> void sort_heap (RandomAccessIterator first, RandomAccessIterator last); ``` 其中,first和last分别为区间的起始和结束迭代器。当前,[first,last)已经是一个堆,sort_heap函数会将该堆转换为有序序列。 需要注意的是,这几个函数都要求操作的区间是一个随机访问迭代器(RandomAccessIterator)类型的迭代器。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值