首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++向量[-2]索引返回奇怪的值

c++向量[-2]索引返回奇怪的值
EN

Stack Overflow用户
提问于 2021-12-20 10:59:20
回答 2查看 101关注 0票数 0

我是c++的新手,刚刚学到了向量。我来自Python,所以我当然检查了是否可以在中使用负索引,这似乎不起作用。

在试图检查它是否有效时,我在不同的环境中遇到了一种非常奇怪的负面索引行为。

.at()函数使用负索引会引发错误,但在使用[]括号时不会出现错误。

这些值是以前内存位置的内容,还是它们所代表的?这就是所谓的undefined behaviour

来源:

代码语言:javascript
复制
#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";
  }
}

输出:

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-12-20 11:10:15

是以前内存位置的这些值内容,还是它们代表什么?这就是所谓的未定义的行为吗?

不,它实际上不是在备份数组开始之前访问内存位置,而是在结束后访问一个内存位置:

如果使用numbers [index],编译器将其解释为numbers.operator[](index),即使用member function operator[]()。此函数接受size_t类型的参数,该参数是一个无符号整数。参数-1被隐式转换为无符号整数,得到一个非常大的数字,并且这个数字超出了std::vector的契约所涵盖的值范围。对这样一个元素的读或写访问是未定义的行为。与at不同的是,operator[]()将参数与向量大小进行比较,以保证在此场景中出现异常,但是对于operator[],没有这样的“安全网”。

票数 2
EN

Stack Overflow用户

发布于 2021-12-20 11:11:22

您可以在C++中使用负索引,而不仅仅是在从索引0开始的容器上。

但是,您可以将迭代器放到向量的中间,并从中进行索引。

代码语言:javascript
复制
std::vector<int> numbers = {3, 6, 9, 12, 15};
std::vector<int>::iterator it = numbers.begin() + 3;
std::cout << it[-2];
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70420794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档