gpt4 book ai didi

c++ - 使用范围检查和带符号的 size_type 扩展 std::vector

转载 作者:搜寻专家 更新时间:2023-10-31 00:25:56 24 4
gpt4 key购买 nike

我想使用一个与 std::vector 具有相同功能的类,但是

  • 替换std::vector<T>::size_type通过一些有符号整数(如 int64_t 或简单地 int ),而不是通常的 size_t .当我使用标准 vector 接口(interface)时,看到编译器在有符号数和无符号数之间的比较中产生警告是非常烦人的。我不能只禁用此类警告,因为它们确实有助于捕获编程错误。
  • assert(0 <= i && i < size());里面operator[](int i)检查超出范围的错误。据我了解,这将是比调用 .at() 更好的选择。因为我可以在发布版本中禁用断言,所以性能将与 vector 的标准实现相同。我几乎不可能使用std::vector无需在每次操作前手动检查范围,因为 operator[]是几乎所有与内存访问相关的奇怪错误的根源。

我想到的可能选项是

  1. 继承自 std::vector。这不是一个好主意,如以下问题所述:Extending the C++ Standard Library by inheritance? .
  2. 使用组合(将 std::vector 放入我的类中)并重复 std::vector 的所有接口(interface).这个选项迫使我考虑当前的 C++ 标准,因为一些方法的接口(interface),迭代器在 C++ 98、11、14、17 中略有不同。我想确定的是,当 c++ 20 可用时,我可以简单地使用它而无需重新实现我的 vector 的所有接口(interface)。

最佳答案

从评论中阅读对潜在问题的更多答案:

For example, I don't know how to write in a ranged-based for way:

for (int i = a.size() - 2; i >= 0; i--) { a[i] = 2 * a[i+1]; }

你可以把它改成像这样的通用的:

std::vector<int> vec1{ 1,2,3,4,5,6};
std::vector<int> vec2 = vec1;

int main()
{
// generic code
for ( auto it = vec1.rbegin()+1; it != vec1.rend(); it++ )
{
*it= 2* *(it-1);
}

// your code
for (int i = vec2.size() - 2; i >= 0; i--)
{
vec2[i] = 2 * vec2[i+1];
}

for ( auto& el: vec1) { std::cout << el << std::endl; }
for ( auto& el: vec2) { std::cout << el << std::endl; }
}

不使用基于范围的,因为它无法访问相对于位置的内容。

关于c++ - 使用范围检查和带符号的 size_type 扩展 std::vector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54476633/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com