#include <deque>
#include <iostream>
#include <algorithm>
#include <memory> //这个是我后加的, 不能解决问题
using namespace std;
int main()
{
deque<int,alloc,8> ideq(20,9);
cout << "size =" << ideq.size() << endl;
for(int i=0; i<ideq.size();++i){
ideq[i] = i;
cout << ideq[i] << ' ';
}
cout << endl;
for(int i=0; i<3; ++i)
ideq.push_back(i);
}
<<STL源码剖析>>中4.4.5节测试程序不能通过, 测试环境ubuntu14.04, 编译器gcc与g++(书上指定),更换了stl版本98,03,11均不可
提示
deque-test.cc: In function ‘int main()’:
deque-test.cc:9:15: error: ‘alloc’ was not declared in this scope
deque<int,alloc,8> ideq(20,9);
提示找不到alloc,
用了std::allocator::alloc 与 std::allocator::_Alloc 提示:
deque-test.cc: In function ‘int main()’:
deque-test.cc:9:36: error: template argument 2 is invalid</span>
deque<int,std::allocator::alloc> ideq(20,9);
用了std::allocator<int> 可以通过两个参数, 输出正确
deque<int,std::allocator<int> > ideq(20,9);
但是不接受第三个参数
deque<int,std::allocator<int>,8 > ideq(20,9);
提示
deque-test.cc: In function ‘int main()’:
deque-test.cc:9:37: error: wrong number of template arguments (3, should be 2)
deque<int,std::allocator<int>,8 > ideq(20,9);
查了STL源码, 只搜到一个能接受三个参数的deque, 第三个参数是bool
查了一圈, 中文网上没有消息, 或许他们都知道了这个特性, 或许没有遇到这样的问题.
在SGI STL 源码(最新)注释文件中写到了
/*
* In previous versions of deque, there was an extra template
* parameter so users could control the node size. This extension
* turns out to violate the C++ standard (it can be detected using
* template template parameters), and it has been removed.
*/
意思是c++标准中不再添加可以让用户控制node 大小的程序(侯捷版本是设置buffer大小. )
提示之前的版本有这个功能
以及对 stl_alloc.h
/* NOTE: This is an internal header file, included by other STL headers.
* You should not attempt to use it directly.
*/
由于不知道之前的版本是什么, 挨个试了年份98年之前的c++版本, 编译器都找不到, 看来也许被完全抛弃了
----------------------------
后面的测试程序也遇到了类似的问题, 就当书上的程序输出都正确吧, 我用c++11编译基本不通过的, 用法也应该变了
比如
#include <hash_set>
#include <iostream>
#include <functional>
using namespace std;
using namespace __gnu_cxx;
int main()
{
hashtable<int,int,hash<int>,_Identity<int>,equal_to<int> >
iht(50, hash<int>() , equal_to<int>());
cout << iht.size() << endl;
cout << iht.bucket_count() << endl;
}
可以通过98,03 但是会提示warning