当我在cppreference.com处结束std::vector
时,发现了一个名为" 会员类型"我不明白这意味着什么。实际上,成员类型部分存在于stl
库中的容器的所有参考文档中。
有人可以帮助我理解这个吗?
答案 0 :(得分:3)
这是C ++中的一个典型类:
struct Foo
{
int n; // non-static data member
static const float x; // static data member
int f() const; // non-static member function
static int g(); // static member function
template <typename T>
void h(T); // non-static member function template
struct X { bool a; }; // member type
template <typename> struct Q; // member class template
using T = Q<int>; // member type (member typedef)
};
使用示例:
// Use static members
print(Foo::x);
print(Foo::g());
Foo::X y;
Foo::Q<double> z;
Foo::T w;
// Use non-static members (requires instance)
void demo(const Foo & a)
{
print(a.n);
print(a.f());
print(a.h<float>());
}
答案 1 :(得分:3)
成员类型定义向量对象使用的类型。许多标准容器使用成员类型来描述所使用的类型,因此程序员不需要手动计算它们。这在使用复杂模板时特别有用,其中类型可能很难确定。
例如,返回类型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;
}
迭代器可能是标准容器中成员类型的最常见用法。我们可以只使用容器公开的iterator
成员类型,而不必弄清楚迭代器是一个随机访问迭代器,一个简单的前向迭代器,还是任何其他类型的迭代器。
C ++ 11 auto
关键字可以更进一步。而不是做:
const std::vector<int>::size_type size = vec.size();
我们现在可以这样做:
const auto size = vec.size();
,编译器会自动解决它。
一般来说,大多数C ++标准对象将尽可能使用相同的成员类型(例如size_t
为size_type
,T
为value_type
,T&
为reference_type
{1}}),但不保证iterator
std::vector
成员类型与std::list
和TestLogin
不同,因为它们的实现完全不同,并且它们不能使用相同的迭代器类型)。
答案 2 :(得分:1)
您链接的页面列出了“value_type T”的“成员类型”。这是属于或属于T的类型定义。考虑
using VEC = std::vector<double>;
VEC dv { 4.2 };
现在假设我们要存储来自dv
的值,但我们不想对该类型进行硬编码,以便将来对VEC
定义的更改将做正确的事( TM)。
using VEC = std::vector<double>;
VEC dv { 4.2 };
// ...
VEC::value_type d = dv.front();
或者,如果您想编写跨平台的可移植代码,使用'size_type'确保存储足够大的大小会很有帮助:
int s = dv.size(); // wrong on 64-bit system
VEC::size_type s = dv.size(); // always correct
也就是说,std::vector<double>
托管一个类型定义value_type
,它定义为向量中的“T”类型,或者在我们的例子中为double。
这对于通用编程来说非常重要:
template<typename T>
void dothing(const T& container)
{
T::const_pointer* c = &container; // for some reason I need it's address
// .. other stuff
}
答案 3 :(得分:0)
您需要了解两件事:
例如,
using blah = int;
会使blah
成为int
的别名。换句话说,您可以在任何地方使用blah
代替int
。
(还有另一种方法可以使用typedef
代替using
制作类型别名,但它的可读性较差。)
例如,如果您声明了以下结构
struct S
{
using type = int;
};
您可以使用S::type
而不是int。
类中的此类别名通常称为成员类型。