问题描述
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
还是迭代器?
一个功能对象,用于比较类型的对象 通过使用 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->first
和last.first
。如果第一个键较小,则返回true
"*"
如何影响返回的迭代器?
取消引用(*
)表示 存储在last
中的值不是迭代器 ,而是该存储位置的副本在地图中的位置,顺便说一句是地图的最后一个节点。它的工作方式与取消引用指针的方式相同,您将获得它所指向的值,而不是指针本身。
value_comp是否将
*i++
与最后一个值或迭代器进行比较?
是的。它比较两个键,一个“由i
指向”的键和一个存储在last
中的键。只要第一个参数键在地图上的位置比第二个参数键的位置低,该方法将返回true。
在您的示例中,当按键匹配时,循环结束。
根据方法说明:
它返回一个比较对象,该对象可用于比较两个元素以获取第一个元素的键是否在第二个元素之前。
返回的比较对象是成员类型为
map::value_compare
的对象,该对象类型是一个嵌套类,它使用内部比较对象来生成适当的比较功能类。
旁注:
很明显,*i++
还会返回i
的内容,并且迭代器i
在每次迭代时都会递增,但是此表达式可能会引起混淆,您可以使用方括号为了避免这种情况,就像*(i++)
。