迭代器上的向量下标超出范围
Vector subscript out of range on iterator
#include <iostream>
#include <random>
#include <fstream>
#include <time.h>
using namespace std;
bool generateRandomValue()
{
static std::default_random_engine e{};
static std::uniform_int_distribution<int> d{ 0, 100 };
bool headsTails = (d(e) > 50) ? true : false;
return headsTails;
}
int main()
{
clock_t tStart = clock();
ofstream outputFile("output.txt");
int totalHeads = 0;
int totalTails = 0;
vector<int> headList(100,0);
vector<int> tailList(100,0);
for (int out = 0; out <= 100; out++)
{
char result = '[=10=]';
int heads = 0, tails = 0;
for (int i = 0; i < 100000; i++)
{
result = (generateRandomValue()) ? 'H' : 'T';
if (result == 'H')
{
heads++;
}
else
{
tails++;
}
}
outputFile << "Trial " << out << ": Heads: " << heads << " Tails: " << tails << endl << endl;
headList.push_back(heads);
tailList.push_back(tails);
}
for (vector<int>::iterator i = headList.begin(); i < headList.end(); i++)
{
totalHeads += headList[*i];
totalTails += tailList[*i];
}
cout << "It took: " << (double)(clock() - tStart) / CLOCKS_PER_SEC << " seconds to calculate and execute this program.\n";
outputFile << "Total number of heads: " << totalHeads << " Total number of tails: " << totalTails << endl;
return 0;
}
上面是一些我一直在搞乱的代码,只是为了尝试向量(从未在 class 中使用过它们)。代码在 VS2015 中编译,但程序崩溃并出现以下错误:"Vector subscript out of range".
我假设这告诉我,在我的程序中的某个时刻,一个向量正试图在其范围之外的位置寻址。我无法判断错误是在我的存储向量上抛出还是在最后一个 for 循环中的迭代器向量上抛出,并且调试不起作用,因为程序在开始调试之前就崩溃了(奇怪的是它不是'然后是编译时错误)。
在此代码中:
for (vector<int>::iterator i = headList.begin(); i < headList.end(); i++)
{
totalHeads += headList[*i];
totalTails += tailList[*i];
}
迭代器 i
迭代 headList
向量的所有元素。 *i
为您提供该值(即该迭代中的正面数量)。您将其用作向量 totalHeads
和 totalHeads
的索引,哪些接缝是错误的。你的循环应该是:
for (size_t i = 0; i < headList.size(); i++)
{
totalHeads += headList[i];
totalTails += tailList[i];
}
注意:虽然这个循环:
for (vector<int>::iterator i = headList.begin(); i < headList.end(); i++)
适用于随机访问迭代器,比较常见的写法是:
for (vector<int>::iterator i = headList.begin(); i != headList.end(); ++i)
这样它也适用于前向迭代器,您可以在不修改太多代码的情况下更改容器类型。 ++i
可以更有效,尤其是对于迭代器,而不是整数类型。
#include <iostream>
#include <random>
#include <fstream>
#include <time.h>
using namespace std;
bool generateRandomValue()
{
static std::default_random_engine e{};
static std::uniform_int_distribution<int> d{ 0, 100 };
bool headsTails = (d(e) > 50) ? true : false;
return headsTails;
}
int main()
{
clock_t tStart = clock();
ofstream outputFile("output.txt");
int totalHeads = 0;
int totalTails = 0;
vector<int> headList(100,0);
vector<int> tailList(100,0);
for (int out = 0; out <= 100; out++)
{
char result = '[=10=]';
int heads = 0, tails = 0;
for (int i = 0; i < 100000; i++)
{
result = (generateRandomValue()) ? 'H' : 'T';
if (result == 'H')
{
heads++;
}
else
{
tails++;
}
}
outputFile << "Trial " << out << ": Heads: " << heads << " Tails: " << tails << endl << endl;
headList.push_back(heads);
tailList.push_back(tails);
}
for (vector<int>::iterator i = headList.begin(); i < headList.end(); i++)
{
totalHeads += headList[*i];
totalTails += tailList[*i];
}
cout << "It took: " << (double)(clock() - tStart) / CLOCKS_PER_SEC << " seconds to calculate and execute this program.\n";
outputFile << "Total number of heads: " << totalHeads << " Total number of tails: " << totalTails << endl;
return 0;
}
上面是一些我一直在搞乱的代码,只是为了尝试向量(从未在 class 中使用过它们)。代码在 VS2015 中编译,但程序崩溃并出现以下错误:"Vector subscript out of range".
我假设这告诉我,在我的程序中的某个时刻,一个向量正试图在其范围之外的位置寻址。我无法判断错误是在我的存储向量上抛出还是在最后一个 for 循环中的迭代器向量上抛出,并且调试不起作用,因为程序在开始调试之前就崩溃了(奇怪的是它不是'然后是编译时错误)。
在此代码中:
for (vector<int>::iterator i = headList.begin(); i < headList.end(); i++)
{
totalHeads += headList[*i];
totalTails += tailList[*i];
}
迭代器 i
迭代 headList
向量的所有元素。 *i
为您提供该值(即该迭代中的正面数量)。您将其用作向量 totalHeads
和 totalHeads
的索引,哪些接缝是错误的。你的循环应该是:
for (size_t i = 0; i < headList.size(); i++)
{
totalHeads += headList[i];
totalTails += tailList[i];
}
注意:虽然这个循环:
for (vector<int>::iterator i = headList.begin(); i < headList.end(); i++)
适用于随机访问迭代器,比较常见的写法是:
for (vector<int>::iterator i = headList.begin(); i != headList.end(); ++i)
这样它也适用于前向迭代器,您可以在不修改太多代码的情况下更改容器类型。 ++i
可以更有效,尤其是对于迭代器,而不是整数类型。