成员类型定义矢量对象使用的类型。许多标准容器使用成员类型来描述所使用的类型,这样程序员就不需要手动弄清楚它们。这在使用复杂模板时特别有用,其中类型可能难以确定。
例如, 的返回类型std::vector<___>::size()通常是std::size_t,但是另一个 C++ 向量实现可能返回不同的整数类型(例如int32_t)。您可以简单地使用向量公开的成员类型,每次都用完美的类型编写代码,而不是假设代码中需要什么类型(并且可能引入危险的转换)。例如:
std::vector<int> vec;
const std::vector<int>::value_type val = 4;
// std::vector<int>::value_type is a typedef of int!
vec.push_back(val);
const std::vector<int>::size_type size = vec.size();
// std::vector<int>::size_type is a typedef of std::size_t, usually.
const std::size_t size2 = vec.size();
// same as above, but we assume that vec.size() returns a size_t.
// If it does not, we may cause a narrowing conversion!
for (std::vector<int>::const_iterator it = vec.begin(), end = vec.end(); it != end; ++it)
{
// The const_iterator type is also a member type of vector.
std::cout << *it << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
迭代器可能是标准容器中成员类型最常见的用法。我们不必弄清楚迭代器是随机访问迭代器、简单的前向迭代器还是任何其他类型的迭代器,我们只需使用iterator容器公开的成员类型即可。
C++11auto关键字可以更进一步。而不是这样做:
const std::vector<int>::size_type size = vec.size();
Run Code Online (Sandbox Code Playgroud)
我们现在可以这样做:
const auto size = vec.size();
Run Code Online (Sandbox Code Playgroud)
编译器会自动计算出来。
一般来说,大多数 C++ 标准对象将尽可能使用相同的成员类型(例如size_tfor size_type、Tfor value_type、T&for reference_type),但不能保证( for和的iterator成员类型不同,因为它们的实现截然不同,并且不能使用相同的迭代器类型)。std::vectorstd::list
| 归档时间: |
|
| 查看次数: |
754 次 |
| 最近记录: |