运行时vector断言失败表达式:vector下标超出范围
C++ Assertion Failed on vector at runtime Expression: vector subscript out of range
我收到这个非常烦人的错误消息。我知道我是新手,但这似乎是我能弄明白的事情。谁能告诉我我哪里错了?
运行时的消息是:调试断言失败!计划:....文件:c:program filesmicrosoft visual studio 10.0vcincludevector线:932表达式:Vector下标超出
,代码是
#include "VectorIntStorage.h"
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
void VectorIntStorage::Read(istream& r)
{
char c[13];
r >> c;
r >> NumberOfInts; //gets number of ints for vector
//numberVector = new std::vector<int> numberVector;
for(int i = 0; i < NumberOfInts; i++)
{
r >> numberVector[i];
cout << numberVector[i] << endl;
if(_sortRead) //true
{
for(int k = 0; k < i; k++)
{
if(numberVector[i] < numberVector[k])
{
int temp = numberVector[k];
numberVector[k] = numberVector[i];
numberVector[i] = temp;
}
}
}
}
}
void VectorIntStorage::Write(ostream& w)
{
for(int i = 0; i < NumberOfInts; i++)
{
w << numberVector[i] << endl;
cout << numberVector[i] << endl;
}
}
void VectorIntStorage::sortStd()
{
sort(numberVector.begin(), numberVector.end());
}
void VectorIntStorage::sortOwn()
{
quickSort(0, NumberOfInts - 1);
}
void VectorIntStorage::setReadSort(bool sort)
{
_sortRead = sort;
}
void VectorIntStorage::quickSort(int left, int right)
{
int i = left, j = right;
int tmp;
int pivot = numberVector[(left + right) / 2];
while (i <= j)
{
while (numberVector[i] < pivot)
i++;
while (numberVector[j] > pivot)
j--;
if (i <= j)
{
tmp = numberVector[i];
numberVector[i] = numberVector[j];
numberVector[j] = tmp;
i++;
j--;
}
}
if (left < j)
{
quickSort(left, j);
}
if (i < right)
{
quickSort(i, right);
}
}
VectorIntStorage::VectorIntStorage(const VectorIntStorage& copying)
{
//int *duplicate = new int[(copying.NumberOfInts)];
//vector<int> *duplicate = new vector<int>;
//std::copy(numberVector.begin(), numberVector.end(), duplicate);
//numberVector = duplicate;
//NumberOfInts = copying.NumberOfInts;
}
VectorIntStorage::VectorIntStorage(void)
{
}
VectorIntStorage::~VectorIntStorage(void)
{
}
我们没有足够的信息来确定,但我怀疑失败的行是r >> numberVector[i]
。我想你的意思是说int j; r >> j; numberVector.push_back(j);
问题正是错误消息所说的:您的矢量下标(i
)超出了范围。具体来说,你永远不会增加向量的大小,所以它的大小总是0。因此,operator[]
的任何使用都将引用超出范围的元素。
你不能只使用numberVector[i]
而不先调用numberVector.resize()
。
vector<int> vec;
vec[1] = 0; // fails - vec is empty so [1] is out of range
vec.resize(100);
vec[1] = 5; // ok, you can access vec[0] .. vec[99] now
vec.push_back(11); // Now the size is 101 elements, you can access vec[0] .. vec[100]
r >> NumberOfInts; //gets number of ints for vector
从上面的评论,似乎你需要一个大小为NumberOfInts
的向量。但是留下一行注释-
//numberVector = new std::vector<int> numberVector;
你将vector声明为-
std::vector<int> numberVector; // The size of the vector is 0
要在numberVector
上执行[]
的操作,它的大小应该被提及,并且应该在while声明的有效范围内。由于没有提到while声明,因此需要执行push_back
操作来动态地增加vector的大小。
for(int i = 0; i < NumberOfInts; i++)
{
r >> numberVector[i]; // Size isnot initially mentioned while declaration
// of the vector to do an `[]` operation
cout << numberVector[i] << endl;
// ....
相关文章:
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- 如果变量数据包含大于 vector 所有元素的整数,则仅在视觉工作室上接收"矢量下标超出范围"?
- 使用范围库初始化 std::vector
- 示例代码中使用分隔符将 std::string 拆分为 std::vector 的范围问题
- 将视图范围设置为std::vector
- std::vector 范围构造函数可以调用显式转换吗?
- 基于 C++ 范围的 std::vector 迭代的顺序
- C++ 如何在 std::vector 中插入一个连续的间隔范围?
- 在基于范围的循环中使用shared_ptr到std :: vector
- std::vector<std::vector<int>>:调试断言失败。C++矢量下标超出范围保留内存
- 在<Object>基于范围的 for 循环中从 std::vector 获取指向对象的指针
- 为什么此代码会给出 Vector 超出范围错误
- "vector"未在此范围内声明
- 我的程序正在抛出一个错误,声称Vector下标超出了范围.(C )
- 基于范围的loop和std :: vector.push_back()崩溃了程序
- C 内存管理问题,std :: vector nevere rase内存超出范围
- 使用范围检查和带符号的size_type扩展std::vector
- 擦除范围从std :: vector删除向量的最佳方法
- 当第一个 itr 在最后一个 itr 之后时,std::vector 范围构造函数的官方行为是什么?
- 在 std::vector 中插入迭代器范围