为什么向量的数据类型在C++的尖括号内声明

Why datatype of vectors are declared within angle brackets in C++?

本文关键字:声明 C++ 向量 数据类型 为什么      更新时间:2023-10-16

我对在C++中声明数据类型感到困惑。通常,它写成 - int a; 这意味着变量 a 是整数数据类型。但是对于数组的向量类型,它写为 - vector<integer> vectorname; 为什么这是必要的?是因为向量就像C++中的一个类吗?我检查了以下链接,这些链接讨论了一些相关的主题:

  • 使用非类型模板参数而不是常规参数的原因?
  • 什么是参数值的尖括号,它的用途是什么?

这些链接讨论了尖括号对模板声明的实用性,我理解并知道这一点。我无法得到为什么这些对于向量是必需的问题的答案。

每当你在C++中看到类似<T>的东西时,那就是一个模板。 模板就像一个"配方",可用于在编译时制作另一段代码。 或者换句话说,T(通常是一种类型,如intstring)只是一个参数,就像C或任何其他语言中的函数具有参数一样。 但是C++这些参数是在编译时计算的,因此一旦程序构建完成,它们就不需要执行任何成本。

从类模板std::vector或其他容器指定的类型名称将指定将使用的数据类型,然后在编译时生成代码。应在尖括号或模板参数内指定要使用的数据类型。

由于 CTAD(类模板参数推导)是在 C++ 17 中引入的,这与函数模板参数推导相同,因此不再需要指定其类型,因为编译器将对此执行某些操作,除非您声明实例而不进行初始化。

// Before C++ 17:
std::vector<int> vect1 {4, 5, 10, 4, 10}; // ok!
std::vector vect2 {3, 1, 5, 10}; // error: missing template arguments!
// Since C++ 17:
std::vector<int> vect3 {23, 12, 5, 12}; // ok!
std::vector vect4 {4, 2, 1, 1, 3, 10}; // ok!
std::vector vect5; // error: class template argument deduction failed!
std::vector<int> vect5; // ok!

vect4的类型将与其他实例的类型完全相同,即std::vector<int>或内部std::vector<int, std::allocator<int>>