c++容器无关迭代器

来源:互联网 发布:自治区有什么好处知乎 编辑:程序博客网 时间:2024/06/05 02:13

便于实现部分容器无关算法(完全独立于容器不可能, 见effective stl第2条)

 

这是测试

 

 

 

在我的老机器上输出:

 

1,2,3,0,0,0,0,0,0,0,
24566,30046,9725,20619,11985,162,29172,9116,4089,20568,
8843,18161,18930,27842,19338,14715,28922,9720,5688,29372,
1178,2865,27526,13355,2940,26430,3723,2522,8572,26199,
1,2,3,4,5,6,7,8,9,10,
0=1,1=4,2=9,3=16,4=25,5=36,6=49,7=64,8=81,9=100,
输入要操作的次数(单位百万), 以0结束
100
裸指针耗时: 0.266秒
标准迭代器耗时: 0.266秒
兼容迭代器耗时: 1.5秒

 

 

 

关于性能问题: 上测试中这个兼容迭代器与标准迭代器相差1.3秒, 其中0.9秒是由于要兼容各种容器和数组的多态虚函数开销, 另外就是由于失去了stl函数inline效果等

这两部分开销测试如下

 

虚函数开销

 

非inline开销

 

恩, 性能测试中, 还有0.2秒左右我没找到... 水平问题

 

 

 

总之, 在非性能受限处使用以上迭代器是可行的

 

使用方法:

1,
Iterator<int>     
正向迭代, 返回int引用; 目标容器或数组(new int[n]不行, 必须是数组)必须有int* begin()的声明
 
2,
Iterator<const int> 
正向迭代, 要求目标至少有const int* begin()
 
3,
Iterator<int, true>
逆向迭代
 
4,
Iterator::bindTo
重新绑定新的容器
 
5,
Iterator<int>和Iterator<const int>已经尽量符合iterator和const_iterator的关系
Iterator本身也已经像一般迭代器(指针)一样, 可传值

 

6,

Iterator<ValueType>中的类型必须是容器返回的类型

如测试中, 对于map<FirstType, SecondType>, 如果手工编码的话是Iterator<std::pair<const FirstType, SecondType>>, 因为map的键不允许修改; 所以还是直接使用Container::value_type比较方便

 

 

迭代器代码见下载, 0资源分(我下载频道没分了, 见谅:p)

 http://download.csdn.net/source/2192301 (旧版本)

 

 

 

这是10.4.2重构后新版本代码; 速度上比旧版本低百分之几