什么是vector <int,int>甚至有效吗?

时间:2019-07-11 15:43:28

标签: c++ stdvector

我一直在与vector < pair < int,int>>一起工作,但我不知道类似vector< int,int>的东西也存在,我可以声明它, 但不知道如何使用。

vector < int,int>是有效的容器,如果是,则两者之间的区别是什么 和vector < pair < int,int>>吗?

如果没有,为什么我可以声明它?

2 个答案:

答案 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/vectorstd::vector具有两个模板参数,T(要存储的事物的类型)和Allocator,这是一些类型匹配的Allocator概念。

template <class T, class Allocator = allocator<T> >
class vector

分配器通常用于进行分配。如果您将int用作分配器,则它应该无法编译(这肯定对我有用),因为int不包含Allocator中预期的任何功能。

您的第一个示例vector<pair<int, int>>是一个向量,其中包含的对象是一对整数,而使用的Allocator是默认值。