我是c++的新手,刚刚学到了向量。我来自Python,所以我当然检查了是否可以在中使用负索引,这似乎不起作用。
在试图检查它是否有效时,我在不同的环境中遇到了一种非常奇怪的负面索引行为。
对.at()函数使用负索引会引发错误,但在使用[]括号时不会出现错误。
这些值是以前内存位置的内容,还是它们所代表的?这就是所谓的undefined behaviour吗
来源:
#include <iostream>
#include <vector>
int main() {
std::vector<int> numbers = {3, 6, 9, 12, 15};
std::cout << "Length: " << numbers.size() << "\n";
for (int i = 4; i > -5; i--) {
std::cout << "Pos " << i << ": " << numbers[i] << "\n";
}
}输出:
Length: 5
Pos 4: 15
Pos 3: 12
Pos 2: 9
Pos 1: 6
Pos 0: 3
Pos -1: 0 // other env: 201392090
Pos -2: 33 // other env: 475047512
Pos -3: 0
Pos -4: 0发布于 2021-12-20 11:10:15
是以前内存位置的这些值内容,还是它们代表什么?这就是所谓的未定义的行为吗?
不,它实际上不是在备份数组开始之前访问内存位置,而是在结束后访问一个内存位置:
如果使用numbers [index],编译器将其解释为numbers.operator[](index),即使用member function operator[]()。此函数接受size_t类型的参数,该参数是一个无符号整数。参数-1被隐式转换为无符号整数,得到一个非常大的数字,并且这个数字超出了std::vector的契约所涵盖的值范围。对这样一个元素的读或写访问是未定义的行为。与at不同的是,operator[]()将参数与向量大小进行比较,以保证在此场景中出现异常,但是对于operator[],没有这样的“安全网”。
发布于 2021-12-20 11:11:22
您可以在C++中使用负索引,而不仅仅是在从索引0开始的容器上。
但是,您可以将迭代器放到向量的中间,并从中进行索引。
std::vector<int> numbers = {3, 6, 9, 12, 15};
std::vector<int>::iterator it = numbers.begin() + 3;
std::cout << it[-2];https://stackoverflow.com/questions/70420794
复制相似问题