假设我有一个类,其中包含
然而,是否有更好、更安全的方式来严格使用
在访问元素时,需要使用特定的
在这种情况下,是否有一种常见、通用、更易读的方法?或者我应该只是使用
std::vector<bool> a
和std::vector<int> b
字段,我想在构造函数中为它们分别使用reserve()
预留相同的大小。由于reserve()
接受size_type
参数,为了完全安全,我必须使用两个参数编写构造函数,这不是特别吸引人的选择:MyCtor(std::vector<bool>::size_type size1, std::vector<int>::size_type size2)
{
abortIfNotEqual(size1, size2); // Proceed only if size1 == size2
a.reserve(size1);
b.reserve(size2);
}
根据我所了解的,size_type
通常与size_t
相同,至少对于标准容器而言,因此我可能可以毫不费力地完成这项工作,而不会遇到任何潜在问题:
MyCtor(std::size_t size)
{
a.reserve(size); // More readable, but is this always ok?
b.reserve(size);
}
然而,是否有更好、更安全的方式来严格使用
size_type
,而不必通过特定的container<T>
访问特定类型T
的方法呢?在访问元素时,需要使用特定的
container<T>
也相当麻烦:对于a[i]
,i
必须是std::vector<bool>::size_type
,因为我认为使用例如unsigned int i
会更不安全。在这种情况下,是否有一种常见、通用、更易读的方法?或者我应该只是使用
size_t
甚至unsigned long int
,并忘记这个问题呢?
std::int64_t
或者甚至是int
来代替两者,这样甚至可以让你在调用函数时很好地断言没有人意外产生了负值。如果你想听听委员会的知名成员提供类似的建议,请参考以下链接: https://channel9.msdn.com/Events/GoingNative/2013/Interactive-Panel-Ask-Us-Anything 9:50, 42:40, 1:02:50 - Baum mit Augenstd::common_type
,但我认为那太过于复杂了。 - Baum mit Augenstd::size_t
必须足够大以表示分配的内存的最大大小,并且向量中的所有对象的大小都大于1,因此std::size_t
可以表示任何向量的大小。 - Olivstd::vector<bool>
索引位,所以这可能没有帮助。 - Baum mit Augensize_t
和静态断言,它与vector<T>::size_type
相同。这既安全又易读。 - Jaa-cstd::size_t
必须足够大以表示分配内存的最大大小",但如果分配的内存来自std::malloc
,我同意它将是如此。相反,std::size_t
必须足够大以存储sizeof
的结果,即任何对象的大小。如果我有一块内存块,sizeof ptr
只返回指针的大小,而不是内存块的大小,所以我不明白为什么内存块不能是"任意"大的。 - Joshua Green