我一直在与vector < pair < int,int>>
一起工作,但我不知道类似vector< int,int>
的东西也存在,我可以声明它,
但不知道如何使用。
vector < int,int>
是有效的容器,如果是,则两者之间的区别是什么
和vector < pair < int,int>>
吗?
如果没有,为什么我可以声明它?
答案 0 :(得分:5)
什么是
vector<int,int>
std::vector
的第二个临时参数是分配器,因此这是一个向量,其分配器的类型为int
。
它甚至有效吗?
不。 int
不满足分配器的要求。
如果没有,为什么我可以声明它?
好吧,使用至少两个模板参数实例化一个模板,并使用两个类型参数实例化最多两个没有默认值的模板参数。直到尝试使用分配器,您才可能会遇到格式正确的问题。
无法用语言来表示模板参数必须满足某些属性,并且标准库也没有这种强制性。提议在将来的C ++标准中引入的 Concepts 功能可用于强制执行(某些)此类要求,并且将来可能还要求容器使用这些概念。
如果模板实例化不符合标准容器的要求规范,则该标准不需要编译器来诊断错误。引用最新的标准草案:
[res.on.functions]
在某些情况下(替换函数,处理函数,用于实例化标准库模板组件的类型的操作),C ++标准库取决于C ++程序提供的组件。 如果这些组件不符合要求,则本文档对实施没有任何要求。
尤其是在以下情况下,效果是不确定的:
- 对于在实例化模板组件时用作模板参数的类型,如果对类型的操作未实现适用的“要求”子句的语义([allocator.requirements],[container.requirements],[iterator.requirements], [algorithms.requirements],[numeric.requirements])。 除非另有说明,否则对此类类型的操作可以通过引发异常来报告失败。
该声明理论上可以编译,因为没有限制。在我的系统上,它无法编译。
答案 1 :(得分:3)
这里的关键是std::vector
根据文档@ https://devdocs.io/cpp/header/vector,std::vector
具有两个模板参数,T
(要存储的事物的类型)和Allocator
,这是一些类型匹配的Allocator
概念。
template <class T, class Allocator = allocator<T> >
class vector
分配器通常用于进行分配。如果您将int用作分配器,则它应该无法编译(这肯定对我有用),因为int
不包含Allocator
中预期的任何功能。
您的第一个示例vector<pair<int, int>>
是一个向量,其中包含的对象是一对整数,而使用的Allocator
是默认值。