为什么队列接受vector作为其底层容器?

101*_*010 5 c++ stl c++11 c++14

考虑以下代码:

std::queue<int, std::vector<int>> Q;
Q.push(1);
Q.push(2);
Run Code Online (Sandbox Code Playgroud)

Live Demo

除了使用具有连续内存的容器作为a的底层容器std::queue会显着恶化排队操作的性能之外,上面的代码片段是完全可以接受和编译的.但是,如果我们调用std::queue::pop成员函数(例如Q.pop();),程序无法编译,并且编译器正确地抱怨std::vector没有成员函数pop_front.

Live Demo

问题:

  1. 为什么可以std::vector接受作为基础容器,std::queue因为它不符合std::queue标准?
  2. 是不是缺少元编程魔法来检查底层容器是否std::queue满足队列定义中的必要条件(例如std::queue<int, std::vector<int>> Q;)?
  3. 概念的出现是否可能在C++ 17中解决了这个问题?

Lig*_*ica 1

为什么 std::vector 可以作为 std::queue 的底层容器,因为它不满足 std::queue 的标准?

它不是。

检查 std::queue 的底层容器是否满足队列定义行中的必要条件(例如,std::queue<int, std::vector<int>> Q;)是否缺少元编程魔法?

这句话没有意义,但如果你问是否可以在实例化时诊断这一点,答案是肯定的。不过,这很大程度上是浪费时间。为了进行比较,请注意出界std::vector::operator[]也是您的责任,并且不会导致诊断。

Concepts-lite(可能是 C++17 中的)的出现可以解决这个问题吗?

既然这根本就是一个“问题”,是的。