STD::向量不调整大小以适应在多个条目C++之后的更多条目

STD::向量不调整大小以适应在多个条目C++之后的更多条目,c++,string,file,csv,vector,C++,String,File,Csv,Vector,我有一个自定义的vector类,它封装了std::vector。我在while循环中使用它逐行读取CSV文件,将列存储到一个名为columns的向量中,并对这些值执行一系列操作。一切正常,但在循环了一些行之后,会抛出错误: 在抛出std::的实例超出\u范围后调用terminate 我假设我的向量由于某种原因停止了大小调整,但是在抛出这个错误并停止之前,它以我希望的方式读取了很多行。我使用std::cerr语句来查看我的两个列值是否被正确读取,使用它,我可以看到它在文件结束之前停止。为什么会这样

我有一个自定义的vector类,它封装了std::vector。我在while循环中使用它逐行读取CSV文件,将列存储到一个名为columns的向量中,并对这些值执行一系列操作。一切正常,但在循环了一些行之后,会抛出错误:

在抛出std::的实例超出\u范围后调用terminate

我假设我的向量由于某种原因停止了大小调整,但是在抛出这个错误并停止之前,它以我希望的方式读取了很多行。我使用std::cerr语句来查看我的两个列值是否被正确读取,使用它,我可以看到它在文件结束之前停止。为什么会这样

while(getline(datafile, line))
{
    string token;
    Vector<string> columns;
    WindLogType windlog2;
    stringstream ss(line);
    columns.add(string());
    while(getline(ss, token, ','))
    {
        columns.add(token);
    }
    stringstream date(columns[1]);
    string windspeed = columns[11];
    string solar1 = columns[12];
    cerr << solar1 << endl;
    string temperature1 = columns[18];
    cerr << temperature1 << endl; 
}
我的向量类:

#ifndef VECTOR2_H
#define VECTOR2_H
#include <iostream>
#include <string>
#include <sstream>
#include <vector>

using namespace std;

template <class T>
class Vector
{
public:
    Vector(){};
    ~Vector();

    void add(const T &obj);
    int vecsize() const{return data.size();}

    T& operator[](const int index);
    const T& operator[](const int index) const;

private:
    vector<T> data;

};

template <class T>
T& Vector<T>::operator[](int index){
    if(index < 0 || index > data.size()){
        throw("Out of bounds");
    }

    return data.at(index);
}

template <class T>
const T& Vector<T>::operator[](int index) const{
    if(index < 0 || index > data.size()){
        throw("Out of bounds");
    }

    return data.at(index);
}

template <class T>
Vector<T>::~Vector(){    
    data.clear();    
}

template <class T>
void Vector<T>::add(const T &obj){    
    data.push_back(obj);    
}

#endif // VECTOR_H

一般情况下,最好不要把它放在桌子上。如果您正在实现在该名称空间中已经找到的功能,例如向量,则可能尤其如此

而不是throwstr;,您应该考虑抛出一个实际的异常类型,例如STD::OutoOfOnLead或者甚至是您自己的异常类型。throwstr有点不寻常,它意味着catch站点必须使用catchconst char*。这不是无效的,但是,这也不是常见的做法

在T&Vector::operator[]int函数和const限定的对应函数中,检查索引是否小于0(这是正确的),但检查索引是否大于内部向量的大小。如果您考虑内部向量为空的情况,那么这意味着根本没有有效的索引,因为没有元素,但是,您的验证将允许索引0到内部向量,因为它不大于大小。如果内部向量有1个元素,那么您的验证同时允许索引0和索引1,这是不正确的,它应该只允许索引0。您可以将此检查改为使用index>=data.size。这被称为“一个接一个”错误

除非您计划提供负索引的实现,否则通常最好使用size\u t或其他无符号整数类型


最后,无需在析构函数中显式调用data.clear,因为向量的析构函数已经可以执行此操作。

您可以向我们展示向量中的相关代码吗?当您没有显示这个自定义类时,很难帮助您解决自定义类中的错误;学习使用调试器或打印明显太小的向量大小。@churill对此表示抱歉。我现在编辑了显示我的向量类的帖子。使用调试器检查向量中的值可能是最好的。不相关,但运算符[]的条件为关闭1,应为'ifindex<0 | | index>=data.size,因为data.size'已超出范围。@thedafferg:运行调试会话并检查这些索引是否存在1、11、12、18。访问器正在检查边界,但忽略了index==size的情况。它应该是index>=0&&index