那些曾经的花儿
好静啊,我们的夜~

     好久没有更新了,现在正在忙着做一个基于OpenCasCade和OGRE的项目,希望能够开发一套基建筑物建模和渲染的平台。等时间成熟,放些代码和截图和大家共享讨论。

     前两天编程序用到了C++ 的multimap表。multimap可以实现同一键的多次存储纪录。本来我想通过下面的代码实现将键值为2的所有记录复制一份,并以键值为3的方式插入到mulitmap表中,结果出现了错误。代码如下:

     typedef  multimap<int, SelfClass*> MultiMapTable;

     typedef  MultiMapTable::iterator MultiMapIter;

     typedef  pair<MultiMapIter, MultiMapIter>  EqualRangeIter

     MultiMapTable multiMapTable;

     ......

     //复制插入操作

     EqualRangeIter eqaulIter = multiMapTable.equal_range(2);

     for(; equalIter.first!=equalIter.second; equalIter.first++)

          multiMapTable.insert(MultiMapTable::value_type<3, equalIter.first.second>));

 

     代码看似没有问题,后来调试发现,for循环语句进入了死循环状态。简单分析了一下,感觉是以下原因:

     当时multiMapTable中记录了key=1和key=2的纪录若干条。且key=2的所有记录是于key=1的记录之后插入到map表中的。这就导致了multiMapTable.end()与equalIter.second指向了同一个地址。而multiMapTable.insert语句的调用则会不停的修改multiMapTable.end()的指针。从而导致了equalIter.first!=equalIter.second语句始终为true;

     修改方式:通过multiMapTable.count(2)计算key=2的纪录iCount条,在for循环中iCount--,在判断条件中添加iCount>=0。通过此方法可以获得正确结果。

     由于key值不一样,觉得通过简单的copy无法实现,不过没有尝试过。

posted on 2008-09-09 19:23  soaroc  阅读(1086)  评论(5编辑  收藏  举报