迭代器操作问题
Posted
技术标签:
【中文标题】迭代器操作问题【英文标题】:problem with iterator manipulation 【发布时间】:2010-03-04 04:49:55 【问题描述】:我有一个 std::map 并且我正在使用迭代器来查找某个键值对。找到它后,我无法从迭代器中获取键值对的位置。通过做另一个 find 我可以得到它,但我想要解决这个问题。
//mycode is this
std::map<std::string,myclass*> mymap;
size_t myfind(const std::string &s)
std::map<std:string,myclass*>::iterator i=mymap.find(s);
if((i==mymap.end())||((*i).second==0))
std::cout<<"some error\n";
else
//here i need to return the size_t value of the iterator i
注意:将 size_t 编辑为键值对的位置
【问题讨论】:
“来自迭代器的 size_t 值”是什么意思? size_t 是 C 中的一种类型,它不是迭代器具有的值。请详细说明 迭代器的size_t
值是什么意思?
size_t
的价值是什么?您的地图使用 std::string
作为键和 myclass *
作为值。我在任何地方都没有看到任何size_t
...
您是否尝试将偏移量返回到找到的位置。该地图具有双向迭代器类型,您不能对它们进行指针类型算术运算。 sgi.com/tech/stl/BidirectionalIterator.html
@Sriram:我担心你想要那个。
【参考方案1】:
如果要返回结果的“位置”:
#include <iterator>
// ...
std::map<std::string,myclass*> mymap;
size_t myfind(const std::string &s)
std::map<std:string,myclass*>::iterator i=mymap.find(s);
if((i==mymap.end())||((*i).second==0))
std::cout<<"some error\n";
else
return std::distance(mymap.begin(), i);
但是,您最好只返回迭代器!
【讨论】:
返回类型应该是mymap::size_type
,而不是size_t
。
你说对了一部分,AndreyT,但是mymap
不是类型。【参考方案2】:
size_t
与什么有什么关系?你找到了键值对,key 是一个字符串,value 是指向某个类的指针。就是这样。你想到了什么size_t
值?
让你走上正轨的一些背景知识:STL 中的 map 和 set 通常实现为平衡二叉树(红黑树)。树中的每个节点都有值(只是 set 的 key,或 map 的 pair, ) 和两个指向子节点的指针。您可以将map::iterator
视为指向具有花哨的重载运算符的节点的指针,例如,递增迭代器值会将指针按排序顺序移动到下一个节点。所以没有“size_t
迭代器的值”。它是一个类的实例,它包装了一个指向二叉树节点的指针。
【讨论】:
以上是关于迭代器操作问题的主要内容,如果未能解决你的问题,请参考以下文章
为什么迭代器只能被一个集合使用呢 为什么迭代器不能在迭代过程中 ?增删呢 是因为 每次迭代时候 把之前的元素给拿出去了 如果你在操作过程中将下一个迭代元素给拿走了(迭代器不具备自动判断长度功能 她依旧