为什么向量的数据类型在C++的尖括号内声明
Why datatype of vectors are declared within angle brackets in C++?
我对在C++中声明数据类型感到困惑。通常,它写成 - int a;
这意味着变量 a 是整数数据类型。但是对于数组的向量类型,它写为 - vector<integer> vectorname;
为什么这是必要的?是因为向量就像C++中的一个类吗?我检查了以下链接,这些链接讨论了一些相关的主题:
- 使用非类型模板参数而不是常规参数的原因?
- 什么是参数值的尖括号,它的用途是什么?
这些链接讨论了尖括号对模板声明的实用性,我理解并知道这一点。我无法得到为什么这些对于向量是必需的问题的答案。
每当你在C++中看到类似<T>
的东西时,那就是一个模板。 模板就像一个"配方",可用于在编译时制作另一段代码。 或者换句话说,T
(通常是一种类型,如int
或string
)只是一个参数,就像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>>
相关文章:
- .cpp和.h文件中的模板专用化声明
- 未在作用域中声明unordered_map
- C++避免重复声明的语法是什么
- 如何确保C++函数在定义之前声明(如override关键字)
- 错误:未在此范围内声明'reverse'
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 为什么在定义函数之前先声明它
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- #ifdef和未声明的标识符
- 没有显式声明的int[]中的foreach
- 在基于范围的for循环中使用结构化绑定声明
- 在将变量声明为引用时,堆在释放后使用
- C++:无法访问声明的受保护成员
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 在函数内部的声明中初始化数组,并在外部使用它
- Visual Studio中的函数声明和函数定义问题
- c++类声明时,相同的例程,不同的成员变量类型
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别