迭代器操作问题

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迭代器的值”。它是一个类的实例,它包装了一个指向二叉树节点的指针。

【讨论】:

以上是关于迭代器操作问题的主要内容,如果未能解决你的问题,请参考以下文章

迭代器的解释

Cpp中迭代器的使用和操作

课时10:迭代器迭代器失效分析

C++迭代器的使用和操作总结

为什么迭代器只能被一个集合使用呢 为什么迭代器不能在迭代过程中 ?增删呢 是因为 每次迭代时候 把之前的元素给拿出去了 如果你在操作过程中将下一个迭代元素给拿走了(迭代器不具备自动判断长度功能 她依旧

begin() 是一个有效的迭代器操作,如果是,它指的是啥?