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

标签 c++

我想使用与 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; }
}

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

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

相关文章:

c++ - 在 MDI 应用程序中的不同功能区之间切换

c++ - 字符串文字的字节序和字符串在 case 语句中的使用

c++ - 确定重定向套接字打开请求的预期 IP 的 POSIX 调用是什么?

c++ - 删除时的二维数组访问冲突(Borland C++)

c++ - 找出一个数组中绝对值最小的元素

C++ 问题 : conflicting declaration

c++ - 可以原子地获取和运算的最大数据类型?

c++ - OpenGL统一标准缓冲区对齐困惑

c++ - 为流运算符返回代理类时解包参数

c++ - 如何让我的类(class)免受 C++ 中的 "auto value = copy of proxy"地雷的影响?