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

时间:2016-06-08 23:27:05

标签: c++ c++11 vector stl

当我在cppreference.com处结束std::vector时,发现了一个名为" 会员类型"我不明白这意味着什么。实际上,成员类型部分存在于stl库中的容器的所有参考文档中。

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

4 个答案:

答案 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_tsize_typeTvalue_typeT&reference_type {1}}),但不保证iterator std::vector成员类型与std::listTestLogin不同,因为它们的实现完全不同,并且它们不能使用相同的迭代器类型)。

答案 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)

您需要了解两件事:

  1. 您可以为类型创建别名。
  2. 例如,

    using blah = int;
    

    会使blah成为int的别名。换句话说,您可以在任何地方使用blah代替int

    (还有另一种方法可以使用typedef代替using制作类型别名,但它的可读性较差。)

    1. 您可以将这些别名放在类中。
    2. 例如,如果您声明了以下结构

      struct S
      {
          using type = int;
      };
      

      您可以使用S::type而不是int。

      类中的此类别名通常称为成员类型