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->first
和 last.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++)
.
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 thelast 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->first
和 last.first
。如果第一个键是 less
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++)
.