关于STL stack内部容器的疑问:默认与指定容器构造传参差异
问题:为何默认底层容器的stack无法用string对象直接构造?
以下代码可以正常运行:
string s; cin >> s; stack<char, string> Left(s);
我理解第二个参数与底层容器相关,stack的默认底层容器是deque。
但以下代码无法运行:
string s; cin >> s; stack<char> Left(s);
我的疑问是:既然string和deque的char存储均为连续内存空间,为何默认容器的stack无法直接传入string对象构造?
解答
核心原因是stack的构造逻辑完全依赖底层容器的构造函数支持,和内存是否连续没有关系:
- 当你显式指定底层容器为
string时,stack<char, string>的构造函数会把传入的string对象直接交给底层的string容器初始化——而string本身就支持用另一个string对象来构造,所以这段代码能正常编译运行。 - 当使用默认的
stack<char>时,底层容器是deque<char>,但deque的构造函数并没有提供接受string类型参数的重载,编译器找不到匹配的构造方式,自然就会报错。
简单来说:stack只是个“适配器”,它本身不做数据存储,只是给底层容器套了个栈的接口。你给stack传的构造参数,本质是要传给底层容器的构造函数,底层容器能接什么,stack才能传什么。deque不接受string作为初始化参数,所以默认stack就不能这么用。
内容的提问来源于stack exchange,提问作者noobdam
相关产品推荐
相关产品推荐

