Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在抛出';std::超出范围';_C++ - Fatal编程技术网

C++ 在抛出';std::超出范围';

C++ 在抛出';std::超出范围';,c++,C++,我是编程的绝对初学者。我在构建以下代码时遇到此错误 error: terminate called after throwing an instance of 'std::out_of_range' what(): vector::_M_range_check: __n (which is 8) >= this->size() (which is 8) Aborted (core dumped) #包括 #包括 #包括 #包括 使用名称空间std; int main() { C+

我是编程的绝对初学者。我在构建以下代码时遇到此错误

error: terminate called after throwing an instance of 'std::out_of_range' what(): vector::_M_range_check: __n (which is 8) >= this->size() (which is 8) Aborted (core dumped)

#包括
#包括
#包括
#包括
使用名称空间std;
int main()
{

C++中的CUT< P>数组和向量索引从0到1,因此当你说

num=planet.size();
后来

if(cPlanet==planet.at(num))
您正试图访问向量
行星
末端的一个。然后
at
成员函数抛出一个类型为
std::out\u of_range
的异常,该异常从未被捕获,因此程序终止

看起来您想查找对应于行星名称的向量索引;您可以使用和按如下方式进行查找:

num = std::distance(planet.begin(), std::find(planet.begin(), planet.end(), cPlanet));

如果未找到
cPlanet
,这将返回
planet.size()
。但是,使用一个

来实现整个过程可能会更好。这里有一个更简单的程序来重现该行为:

#include <vector>

int main()
{
    std::vector<int> v;
    v.push_back(123); // v has 1 element  [0 to 0]
    v.push_back(456); // v has 2 elements [0 to 1]
    v.push_back(789); // v has 3 elements [0 to 2]
    int x1 = v.at(0); // 123
    int x2 = v.at(1); // 456
    int x3 = v.at(2); // 789
    int x4 = v.at(3); // exception
}
[]
类似于
at
,但在编程错误上采取了完全不同的立场;
at
类似于“如果你用非法索引给我打电话,我会抛出一个异常,这样我们就可以继续,好吗?”,而
[]对于非法向量索引,<>强>行为是未定义的< /强>。这意味着C++实现只允许终止程序而不意外地捕获异常并“继续下去”。。这取决于您调用编译器的方式,通常要求您检查编译器的配置选项(例如或)


<> P>尽可能快地终止是正确的事情,当你发现你自己的代码是错误的。不要在< /COD>的行为中习惯< C++ >。并用它在引用的内存位置中找到的数据默默地做一些错误的事情,这不是“任何优秀的C++实现”的情况。Wintermute将在编译代码时确保不删除所有这些检查。除非性能惩罚实际上是可见的。也许更好的方法是:“任何优秀的C++实现都允许你可靠地终止”。“C++的实现”是我多年来的一个C++程序员;-我很高兴地认为,在代码>操作符[]/COD>中没有开销。在普通的C++实现中,这种检查只存在于“安全”中。“MSVC运行库的版本。gcc的libstdc++和clang的libc++都不包含这样的检查。依赖它们的存在是鲁莽的。@Wintermute:那
\u GLIBCXX\u DEBUG
呢?”?
#include <vector>

int main()
{
    std::vector<int> v;
    v.push_back(123); // v has 1 element  [0 to 0]
    v.push_back(456); // v has 2 elements [0 to 1]
    v.push_back(789); // v has 3 elements [0 to 2]
    int x1 = v.at(0); // 123
    int x2 = v.at(1); // 456
    int x3 = v.at(2); // 789
    int x4 = v.at(3); // exception
}
tTime = distance[num] / speed;