向量中的成员类型意味着什么?

Nir*_*tha 4 c++ stl vector c++11

当我浏览std::vectorcppreference.com并发现一个名为“成员类型”的部分时,我不明白这意味着什么。事实上,成员类型部分存在于stl库中容器的所有参考文档中。

有人可以帮助我理解这一点吗?

Kar*_*oll 6

成员类型定义矢量对象使用的类型。许多标准容器使用成员类型来描述所使用的类型,这样程序员就不需要手动弄清楚它们。这在使用复杂模板时特别有用,其中类型可能难以确定。

例如, 的返回类型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_typeTfor value_typeT&for reference_type),但不能保证( for和的iterator成员类型不同,因为它们的实现截然不同,并且不能使用相同的迭代器类型)。std::vectorstd::list