value_comp 和 * 在迭代器之前

value_comp and * before a iterator

value_comp 是做什么的,比如检查第一个值是否等于第二个值?

and * operator before the iterator?

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

How does "*" affect the iterator returned?

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


Does the value_comp compares *i++ and the last value or iterator?

std::map::value_comp returns:

a function object that compares objects of type std::map::value_type (key-value pairs) by using key_comp to compare the first components of the pairs.

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

所以,看起来您基本上有两个问题:

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

“*”运算符 returns value_type 的引用,对于您的地图来说是 std::pair<const char, char>

Does the value_comp compares *i++ and the last value or iterator

value_comp() returns 比较 value_type 类型对象中的键的函数。因此,在您的代码中,它比较键 i->firstlast.first。如果第一个键是 less

,它 returns 为真

How does "*" affect the iterator returned?

解引用(*)表示存储在last中的值不是迭代器,但是存储在地图中该位置的内容的副本,顺便说一下,它是地图的最后一个节点。它的工作方式与取消引用指针的方式非常相似,您得到的是它指向的值,而不是指针本身。

Does the value_comp compares *i++ and the last value or iterator?

是的。它比较两个键,一个“由”i“指向”的键和一个存储在last中的键。只要第一个参数键在地图上的位置低于第二个参数的键,该方法就会 return 为真。

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

根据方法的描述:

It returns a comparison object that can be used to compare two elements to get whether the key of the first one goes before the second.

The comparison object returned is an object of the member type map::value_compare, which is a nested class that uses the internal comparison object to generate the appropriate comparison functional class.

旁注:

可能很明显*i++也return是i的内容,并且迭代器i在每次迭代时递增,但是这个表达式可以造成混淆,你可以使用括号来避免它,像这样 *(i++).