使用通用矢量大小类型的最佳方式是什么
What is the best way to use a common vector size type?
创建模板化向量类时,允许使用其大小类型的最佳方式是什么?从我收集到的信息来看,似乎是要创建一个到真正向量类的接口,然后使用它。如
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的模板化类型(以防其更改)。
如果你担心容器类型的变化,可以选择:
- 为它创建一个typedef,因此
test1
使用与循环中使用的类型名称相同的类型名称来声明,但该名称表示的类型将来可能会更改 - 编写适当的泛型函数,因此容器的类型是模板参数
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没有编译器开销(即膨胀),因此移动它没有太大优势。
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 派生类销毁的最佳实践是什么
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 在reactor中存储eventHandlers的最佳方式是什么
- 在C++中样板"冷/never_inline"错误处理技术的最佳方法是什么?
- 在 c++ 中对类中的 c 字符串动态数组进行排序的最佳方法是什么?
- 将一系列整数放入类的最佳方法是什么?
- Qt - QVector 和模型视图 - 从列表视图获取自定义类的最佳方法是什么?
- 使用 Git 处理 C++ Visual Studio 2019 解决方案的外部依赖项源代码管理的最佳方法是什么?
- 比较两个节点坐标的最佳方法是什么?
- 在nodejs中使用本机代码的最佳方法是什么?
- 读取大文件(>2GB)(文本文件包含以太网数据)并通过不同参数随机访问数据的最佳方法是什么?
- 在 c++ 中解析数据包数据的最佳方法是什么?
- 初始化数组、"memset"或" {//value} "的最佳方法是什么?
- 处理影响跨不同线程共享对象的定时回调的最佳方法是什么?
- 在自定义 std::vector-like 容器中处理指针和非指针模板类型的最佳方法是什么?
- 在向量中查找大于 0(或通常为 k)的最小元素的最佳方法是什么?