如果变量数据包含大于 vector 所有元素的整数,则仅在视觉工作室上接收"矢量下标超出范围"?
Recieving "vector subscript out of range" only on visual studio if variable data contains an integer greater than all elements of vector?
cin >> q;
while (q--)
{
cin >> data;
//if this value is greater than all the elements of the vector throwing error
vector<int>::iterator low = lower_bound(v.begin(), v.end(), data); //does the lower bound
if (v[low - v.begin()] == data)
cout << "Yes " << (low - v.begin() + 1) << endl;
else
cout << "No " << (low - v.begin() + 1) << endl;// while this should be the output
}
如果向量 V 包含 1 2 3 4 5 6 7 8 我们输入数据 9 然后它将错误显示为超出范围的矢量下标。
根据 cppreference.com 上的std::lower_bound()
文档:
返回一个迭代器,指向范围
[first, last)
中的第一个元素,该元素不小于(即大于或等于(value
,如果未找到此类元素,则返回last
。
在你对lower_bound(v.begin(), v.end(), data)
的调用中,当v
{1 2 3 4 5 6 7 8}
而data
是9时,v
中没有>= data
的元素,所以v.end()
被返回到low
。因此,low - v.begin()
是v.end() - v.begin()
,它产生一个超出向量边界的索引 (8((有效索引为 0-7(。然后哪个Visual Studio警告你。
当找不到匹配的元素时,您需要添加std::lower_bound()
条件检查:
auto low = lower_bound(v.begin(), v.end(), data);
if (low == v.end()) // <-- ADD THIS!
{
cout << "Not found" << endl;
}
else
{
auto index = low - v.begin();
if (v[index] == data)
cout << "Yes " << (index + 1) << endl;
else
cout << "No " << (index + 1) << endl;
}
视觉工作室上接收"矢量下标超出范围"...
Visual Studio给出这个断言是正确的。
Visual C++运行时的调试版本将检查std::vector
的索引,并在存在越界访问时报告问题。
您使用的另一个编译器不会向您报告此错误,因为实际上,如果访问越界项,std::vector
的operator []
具有未定义的行为。 因此,当你看到输出时,你就错了——你的程序有一个逐个错误。
为了证明这一点,下面是您的代码,但它使用at()
而不是[ ]
来访问元素:
#include <vector>
#include <iostream>
int main()
{
std::vector<int> v = {1,2,3,4,5,6,7,8};
std::vector<int>::iterator low = lower_bound(v.begin(), v.end(), 9);
if (v.at(low - v.begin()) == 9)
std::cout << "Yes " << (low - v.begin() + 1) << std::endl;
else
std::cout << "No " << (low - v.begin() + 1) << std::endl;// while this should be the output
}
现场示例
注意到std::out_of_range
例外吗? 现在,无论您使用哪种编译器,您都会收到相同的错误,因为vector::at()
会进行边界检查。
现在这是您的原始代码:
原始代码
请注意,您获得输出,但您"静默"访问越界元素,因此程序的行为是未定义的。
- 视觉工作室项目.提取源文件夹名称
- 为什么我在尝试模板时遇到视觉工作室C++错误
- 视觉工作室 2017;启用 /permissive 时,类型 "const wchar_t *" 的参数与类型 "PWSTR" 的参数不兼容
- VI工作室代码错误无法打开输出文件主.exe
- 与其他编译器相比,相同的代码在工作室Microsoft提供不同的输出
- remove(str.begin(), str.end(), );无法正常工作(我正在使用视觉工作室 2012)
- 如何在安卓工作室中将c ++头文件从一个文件夹导入到另一个文件夹?
- 在 embarcadero / RAD 工作室中的 .dfm 文件中使用常量
- 背包问题,视觉工作室问题
- 如果变量数据包含大于 vector 所有元素的整数,则仅在视觉工作室上接收"矢量下标超出范围"?
- PVS 工作室分析
- 编译器错误(英特尔并行工作室 2019 与 Visual Studio 社区 2019)
- C++ 调试断言失败 - 矢量下标超出视觉工作室的范围
- 安卓工作室 |CPP 文件错误错误: 位图库中对"AndroidBitmap_unlockPixels"的未定义引用
- 输出窗口中消息的可视化工作室源
- 可视化工作室项目中C++预编译标头未正确链接
- 在turbo c++中编译.不在视觉工作室
- exteranl原生构建问题,构建命令失败,android工作室
- build命令失败,外部原生问题android工作室
- 已定义/多个对象定义/可视化工作室