c++ - 使用通用 vector 大小类型的最佳方法是什么?

标签 c++ algorithm templates vector

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

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 类。”)。

最佳答案

not having to know the Vector's templated type (in case it changes).

如果您担心容器类型发生变化,可以:

  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元素,但没有“适当的” vector 可以变得比这更大。

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) ...

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

关于c++ - 使用通用 vector 大小类型的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8824441/

相关文章:

c++ - 每次需要时将整个文件从磁盘复制到内存以处理或读取文件中的数据,直到文件全部读取

c++ - 使用 2 种方法提取容器中的数据( pop_front 和 front )

algorithm - 在UTF :s without intermediate encoding之间转换

c - 二叉搜索树排序

c++ - std::sort 和 compare-function with template 不起作用

c++ - C++中元组元素类型的大小总和

c++ - 从 C++ 应用程序运行 NSIS 安装程序而不提示 UAC 权限

java - 使用固定大小的数组实现队列

javascript - 如何在 mustache.js 中完成 if/else?

c++ - 将可变参数模板参数解包到初始化列表中