微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

value_comp和*之前的迭代器

如何解决value_comp和*之前的迭代器

value_comp会做什么,就像它检查第一个值等于第二个值一样?

*运算符是否在迭代器之前?

map<char,char> m = 
{
   { 'a','A' },{ 'b','B' },{ 'c','C' },{ 'd','D' },{ 'e','E' },};

auto last = *m.rbegin(); // How does "*" affect the iterator returned
auto i = m.begin();

do 
{

   cout << i->first
      << " = "
      << i->second
      << endl;
} while (m.value_comp()(*i++,last));  
// Does the value_comp compares *i++ and the last value or iterator

解决方法

*”如何影响返回的迭代器?

dereferences the iterator并给被指点者。表示last的类型

std::pair<const char,char>

decltype(m)::value_type // or std::map<char,char>::value_type 

如果您只有auto last = m.rbegin();(即不进行取消引用),则可以在那里找到迭代器,这意味着last可以推导为std::map<char,char>::iterator


value_comp比较*i++last value还是迭代器

std::map::value_comp返回:

一个功能对象,用于比较类型的对象 通过使用 key_comp std::map::value_type(键值对) 比较两对的前几个元素。

因此,它比较映射的值,而不是指向键-值对的迭代器。

,

因此,看来您基本上有两个问题:

auto last = m.rbegin(); //“ ”如何影响返回的迭代器

“ *”运算符返回value_type的引用,对于您的地图,该引用将为std::pair<const char,char>

value_comp是否将* i ++与最后一个值或迭代器进行比较

value_comp()返回用于比较value_type类型的对象中的键的函数。因此,它在您的代码中比较键i->firstlast.first。如果第一个键较小,则返回true

,

"*"如何影响返回的迭代器?

取消引用(*)表示 存储在last中的值不是迭代器 ,而是该存储位置的副本在地图中的位置,顺便说一句是地图的最后一个节点。它的工作方式与取消引用指针的方式相同,您将获得它所指向的值,而不是指针本身。

value_comp是否将*i++与最后一个值或迭代器进行比较?

是的。它比较两个键,一个“由i指向”的键和一个存储在last中的键。只要第一个参数键在地图上的位置比第二个参数键的位置低,该方法将返回true。

在您的示例中,当按键匹配时,循环结束。

根据方法说明:

它返回一个比较对象,该对象可用于比较两个元素以获取第一个元素的键是否在第二个元素之前。

返回的比较对象是成员类型为map::value_compare的对象,该对象类型是一个嵌套类,它使用内部比较对象来生成适当的比较功能类。

旁注:

很明显,*i++还会返回i的内容,并且迭代器i在每次迭代时都会递增,但是此表达式可能会引起混淆,您可以使用方括号为了避免这种情况,就像*(i++)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。