使用通用矢量大小类型的最佳方式是什么

What is the best way to use a common vector size type?

本文关键字:最佳 是什么 类型 方式 小类      更新时间:2023-10-16

创建模板化向量类时,允许使用其大小类型的最佳方式是什么?从我收集到的信息来看,似乎是要创建一个到真正向量类的接口,然后使用它。如

for(VectorBase::size_type i = 0; i < test1.size(); ++i)

这比有优势

for(Vector<int>::size_type i = 0; i < test1.size(); ++i)

用于使代码更干净,并且不必知道Vector的模板化类型(以防其更改)。

作为我实现的一个例子(如果有更好的方法,下面是我创建它的方式)。

class VectorBase
{
public:
    typedef unsigned int size_type;
protected:
    size_type mCount;
public:
    VectorBase() { mCount = 2; } 
    virtual ~VectorBase() = 0 { }
    size_type size() const { return mCount; }
};
template<typename Type>
class Vector : public VectorBase
{
public:
    Vector() : VectorBase() { }
    ~Vector() { }
};
int main(void)
{
    Vector<int> test1;
    for(VectorBase::size_type i = 0; i < test1.size(); ++i)
    {
        cout << i << endl;
    }
    system("PAUSE");
    return(0);
}

(注意:请不要把它变成"只使用xxx向量类"。).

不必知道Vector的模板化类型(以防其更改)。

如果你担心容器类型的变化,可以选择:

  1. 为它创建一个typedef,因此test1使用与循环中使用的类型名称相同的类型名称来声明,但该名称表示的类型将来可能会更改
  2. 编写适当的泛型函数,因此容器的类型是模板参数T或其他什么,并且使用typename T::size_type作为i的类型。然后,如果类型发生更改,则代码将进行处理

(1)示例:

typedef vector<int> test_type;
test_type test1;
// populate the vector
for (test_type::size_type i = 0; i < test1.size(); ++i) std::cout << i << 'n';

(2)示例:

template <typename Container>
void print_indexes(const Container &test1) {
    for (typename Container::size_type i = 0; i < test.size(); ++i) {
        std::cout << i << 'n';
    }
}

替代解决方案:

1) 只需使用std::size_t。有点作弊,因为原则上我假设一个vector<bool>可以有超过SIZE_MAX的元素,但没有一个"合适"的向量可以比这个更大。

2) (仅限C++11)使用auto作为i 的类型

for (auto i = test.size(); i != 0; --i) std::cout << (test.size() - i) << 'n';

for (decltype(test.size()) i = 0; i < test1.size(); ++i) ...

就我个人而言,我会遵循标准库中使用的样式,而不会为容器类模板使用公共基类。

我认为没有最好的方法。:-)

通过将一些部分移动到一个公共基类,您简化了接口,但也剥夺了派生类或模板专业化的一些选择。

例如,如果您希望vector<char>包含大量字符,则它可能需要long long大小类型。vector<my_huge_type>的潜在专业化可能只需要int

我们是否应该提前决定无符号int总是足够好?也许,也许不是。设计一个接口,如果经常是为了在复杂性和灵活性之间找到一个良好的平衡。

当已经有一个非常好的Vector时,为什么要重写Vector?

如果必须从VectorBase继承,那么最好给VectorBase一个受保护的析构函数,而不是一个公共的虚拟析构函数。

顺便说一句,纯虚拟析构函数的语法不是标准的。

在每个向量模板中保留size_type的typedef没有编译器开销(即膨胀),因此移动它没有太大优势。

相关文章: