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++ - c++中使用构造函数读取文件

c++ - 标准库标识符与用户标识符冲突

c++ - 从 unique_ptr 返回原始指针是否正确?

c++ - 带有多行单元格的 QTableView

c++ - 通过安排任务最大化分数

c++ - 文件包含错误 (C++) : undefined reference to ______

c++ - WaitForRequest 超时崩溃

c++ - 在 C++11 的 lambda 中使用封闭函数中的模板类型可以吗?

c++ - 编译文件的变体问题

c++ - 如何更改使用 STL 打印的精度?