Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.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++ 访问存储在vector中的对象:使用std::vector::at或std::vector::operator[]?_C++_Vector - Fatal编程技术网

C++ 访问存储在vector中的对象:使用std::vector::at或std::vector::operator[]?

C++ 访问存储在vector中的对象:使用std::vector::at或std::vector::operator[]?,c++,vector,C++,Vector,在访问向量元素时使用at和方括号[]真的有什么区别吗 我看到同样的人更喜欢myvector。在myvector[]之上,是否有什么东西使它更可取,比如在某些情况下性能更好,或者与其他一些语言通用?v.ati检查我是否是一个有效的索引ie,0v.ati检查我是否是一个有效的索引ie,0主要区别是运算符[]未选中,如果尝试访问向量的边界之外的内存,则会导致未定义的行为,而.at会检查索引,如果尝试访问向量的边界之外的内存,则会引发异常。主要区别在于运算符[]未选中,如果尝试访问向量的边界之外的内存,

在访问向量元素时使用at和方括号[]真的有什么区别吗


我看到同样的人更喜欢myvector。在myvector[]之上,是否有什么东西使它更可取,比如在某些情况下性能更好,或者与其他一些语言通用?

v.ati检查我是否是一个有效的索引ie,0v.ati检查我是否是一个有效的索引ie,0主要区别是运算符[]未选中,如果尝试访问向量的边界之外的内存,则会导致未定义的行为,而.at会检查索引,如果尝试访问向量的边界之外的内存,则会引发异常。主要区别在于运算符[]未选中,如果尝试访问向量的边界之外的内存,则会导致未定义的行为,然而.at会检查索引,如果您尝试访问超出范围的内存,则会引发异常

std::vector::at和std::vector::operator[]之间的区别在于,如果索引无效,at将引发std::out of_range异常,而如果索引无效,则operator[]将具有未定义的行为

您强烈希望at的唯一原因是,如果您的算法依赖于为越界输入抛出异常,那么就需要at。这似乎是一个非常罕见的用例,因为在任何索引操作之前,通过认真使用大小可以直接避免越界访问,因此越界访问通常只是编程错误

假设越界访问是一个bug而不是一个有效的执行路径,at vs运算符[]的细分如下:

地址:

优势 保证所有平台上的行为 提供了在运行时管理bug的能力 缺点 不清楚越界是运行时错误还是编程错误 无法在发布版本中进行优化 操作员[]:

优势 为bug管理提供了更多空间 例如,实现可以提供断言 它捕获了所有相关的上下文和中断 或打印调试消息 可以在发布版本中进行优化 使关于代码的推理更容易,因为它清楚地表明越界访问是一个编程错误 缺点 并非所有平台都能保证性能 如果选择优化的实现,可能会导致安全问题或其他非常严重且难以调试的错误。 总的来说,我倾向于几乎总是使用操作符[],并根据需要选择优化版本或调试版本。将错误转换为运行时错误很少有用。

std::vector::at和std::vector::operator[]之间的区别在于,如果索引无效,at将抛出std::out of_range异常,而如果索引无效,operator[]将具有未定义的行为

您强烈希望at的唯一原因是,如果您的算法依赖于为越界输入抛出异常,那么就需要at。这似乎是一个非常罕见的用例,因为在任何索引操作之前,通过认真使用大小可以直接避免越界访问,因此越界访问通常只是编程错误

假设越界访问是一个bug而不是一个有效的执行路径,at vs运算符[]的细分如下:

地址:

优势 保证所有平台上的行为 提供了在运行时管理bug的能力 缺点 不清楚越界是运行时错误还是编程错误 无法在发布版本中进行优化 操作员[]:

优势 为bug管理提供了更多空间 例如,实现可以提供断言 它捕获了所有相关的上下文和中断 或打印调试消息 可以在发布版本中进行优化 使关于代码的推理更容易,因为它清楚地表明越界访问是一个编程错误 缺点 并非所有平台都能保证性能 如果选择优化的实现,可能会导致安全问题或其他非常严重且难以调试的错误。
总的来说,我倾向于几乎总是使用操作符[],并根据需要选择优化版本或调试版本。将错误转换为运行时错误很少有用。

不幸的是,超出范围的访问并不总是SEGFULT,您还可能读取未初始化的内存或其他对象的内存。更一般的情况下,您会得到UB.Edited,所以它会显示UB而不是seg fault不幸的是,超出范围的访问并不总是segfult,您还可能读取未初始化的内存或其他对象的内存。更一般地说,你得到UB.Edited,所以它说UB而不是seg fault