vector std::out_of_range 在我自己的模板类中(指向列表节点的指针向量),但我不明白为什么

vector std::out_of_range in my own template class(vector of pointers to list Nodes), but I can't see why

本文关键字:向量 指针 节点 列表 明白 为什么 range of out std 我自己      更新时间:2023-10-16

我正在为一个模板类编写代码,该模板类具有链表和指向链表中某些节点的指针向量。代码是丑陋的,因为我只是写了我认为可能工作的东西,并对其进行了纠正,重点是修复错误消息。

list(相应的,vector也是)保持了排序,因为每次插入元素时,它都会使用position方法找到正确的位置。

最初,我有很多错误,经过多次尝试,我能够修复它们。现在它编译了,但是当我用一个main方法测试它时,如果这个模板类工作正常,它会抛出一个错误消息:

抛出'std::out_of_range'实例后终止调用

():向量:_M_range_check

Aborted (core dumps)

我知道std::out_of_range是什么,但是我真的不明白为什么会发生这个错误。在我的代码中,甚至没有很多部分访问vector的元素。

下面是测试主方法的代码,下一个是模板类(和嵌套迭代器类)的定义。

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>
#include <vector>
#include "ValliHN.h"
using namespace std;
int main() {
    Valli<string> valli;
    valli.insert("K");
valli.insert("H");
valli.insert("N");
valli.insert("H");
valli.insert("J");
for (Valli<string>::iterator i = valli.begin(); i != valli.end(); i++)
    cout << *i << endl;
return 0;
}
模板类
#include"DList.h"
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstdlib>
using std::cout;
using std::endl;
using std::cerr;
using std::vector;
template<typename I>
class Valli {
vector< DNode<I>* > va;
DList<I> lli;
size_t ratio;
friend class iterator;
friend class DList<I>;
public: 
class iterator {
  typename DList<I>::iterator list_iter;
  iterator(DNode<I>* node) 
   : list_iter(typename DList<I>::iterator(node)) { }
  friend class Valli<I>;
  friend class DList<I>;
public:
     I& operator*() const {
        return *list_iter;
     }
     iterator& operator++() {
        ++list_iter;
        return *this;
     }
     iterator operator++(int) {
        iterator* ret = this;
        ++list_iter;
        return *ret;
     }
     iterator& operator--() {
        --list_iter;
        return *this;
     }
     iterator operator--(int) {
        typename DList<I>::iterator ret = list_iter;
        --list_iter;
        return ret;
     }
     bool operator==(const iterator& rhs) const {
        return list_iter == rhs.list_iter;
     }
     bool operator!=(const iterator& rhs) const {
        return list_iter != rhs.list_iter;
     }
     DNode<I>* returnCurr() const {
        return list_iter.returnCurr();
     }
};
explicit Valli<I>(size_t ratio=4)
 : ratio(ratio),
  lli(DList<I>()),
  va(vector< DNode<I>* >()) { }
//   Valli<I>()
//    : Valli<I>(4) { }
~Valli<I>() {
//      delete[] va;
//      delete lli;
}
iterator insert(const I& item) {
   iterator pos = position(va, item);
   lli.insert(pos.returnCurr(), item);
   refresh(4);
   return --pos;
}
iterator find(const I& item) const {
  iterator start = iterator(va.at(binsearch(va, item)));
  iterator end = iterator(va.at(binsearch(va, item)+1));
  while(start != end) {
     if(*start = item) {
        return start;
     }
     else {
        ++start;
     }
  }
}
//   void erase(iterator itr) {}
iterator begin() const {
   lli.begin();
}
iterator end() const {
   lli.end();
}
private:
int binsearch(const vector< DNode<I>* > vec, const I& item) const {
  int left = 0;
  int right = vec.size()-1;
  while(left <= right) {
     int mid = (left+right)/2;
     iterator iter = iterator(vec.at(mid));
     if(item < *iter) {
        right = mid-1;
     }
     else if(item == *iter) {
        return mid;
     }
     else {
        left = mid+1;
     }
  }
  return left;
 }
iterator position(const vector< DNode<I>* > vec, const I& item) const {
  iterator start = iterator(vec.at(binsearch(vec, item)));
  iterator end = iterator(vec.at(binsearch(vec, item)+1));
  while(start != end) {
     if(*start < item) {
        ++start;
     }
     else {
        return start;
     }
  }
}
void refresh(size_t newRatio) {
  iterator iter = begin();
  int count = 0;
  va.clear();
  while(iter!=end()) {
     if(count % newRatio == 0) {
        va.push_back(iter.returnCurr());
     }
     //push_backing the last node - to be added
     iter++;
     count++;
  }
}
};
类DList.h与标准库列表类非常相似。你能看到我代码中的问题吗?另外,你能告诉我,我的代码总体上看起来是好还是坏,就好的编程实践和编码方向的实现而言?

非常感谢!

在我看来,你在第一次插入上有一个超出范围的向量。Insert调用position, position调用binsearch。Binsearch返回0,因为向量为空,position然后调用vector.at(0)(和vector.at(1))。这两个都是超出范围的错误,因为向量是空的。

我只是盯着代码看,所以我可能犯了一个错误。实际上,您应该使用调试器,并找出问题发生的确切位置。