我想使用与 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[]
是几乎所有与内存访问相关的奇怪错误的根源。
我想到的可能选择是
- 继承自 std::vector。正如以下问题所述,这不是一个好主意:Extending the C++ Standard Library by inheritance? .
- 使用组合(将 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/