这类似于this question但不重复。我正在尝试遍历地图并打印每个元素的值,但最后一个元素的输出略有不同。在那个问题中,他们建议使用map.rbegin().base()
,但这对我不起作用。
这是我的代码:
#include <iostream>
#include <map>
int main()
{
std::map <char, int> charMap = { {'a', 1}, {'b', 2}, {'c', 3}, {'d', 4} };
for (auto iter = charMap.begin(); iter != charMap.end(); iter++)
{
std::cout << iter->first << ":\t" << iter->second;
if (iter == charMap.rbegin().base())
std::cout << "\t//This is the last element.\n";
else
std::cout << "\n";
}
}
我希望我的输出看起来像这样:
a: 1
b: 2
c: 3
d: 4 //This is the last element.
但相反,我得到了这个输出:
a: 1
b: 2
c: 3
d: 4
现在我意识到有更好的方法可以做到这一点,但我希望这也可以。为什么我无法比较iter
和charMap.rbegin().base()
?
答案 0 :(得分:11)
使用<iterator>
中的std::next
作为
if (std::next(iter) == charMap.end())
std::cout << "\t//This is the last element.\n";
代替。
答案 1 :(得分:4)
base()
方法将迭代器返回到反向迭代器指向的元素后面的元素。这意味着rbegin().base()
相当于end()
要完成任务,您可以执行以下操作:
#include <iostream>
#include <map>
int main()
{
std::map <char, int> charMap = { {'a', 1}, {'b', 2}, {'c', 3}, {'d', 4} };
for (auto iter = charMap.begin(); iter != charMap.end(); )
{
std::cout << iter->first << ":\t" << iter->second;
if (++iter == charMap.end())
std::cout << "\t//This is the last element.\n";
else
std::cout << "\n";
}
}
答案 2 :(得分:3)
因为std::reverse_iterator
存储迭代器为1
的迭代器,所以charMap.rbegin().base() == charMap.end()
。std::prev
。 here上的图表说明了这一点。
您应该使用std::next
中的<iterator>
或iter == std::prev(charMap.end())
:
std::next(iter) == charMap.end()
或
$(document).ready(function(){
var curModules = 0;
$("input[id^='Sc']").each(function(){
curModules+=1;
});
console.log(curModules);
console.log($("input[id^='Sc']").length);
});
无论你发现哪个更有意义。
答案 3 :(得分:2)
base()
没有返回相同的元素:
基础迭代器是指下一个元素(从
std::reverse_iterator::iterator_type perspective
)到reverse_iterator
当前指向的元素。那是&*(rit.base() - 1) == &*rit
。
这可以按预期工作:
#include <iostream>
#include <map>
int main()
{
std::map <char, int> charMap = { {'a', 1}, {'b', 2}, {'c', 3}, {'d', 4} };
auto last = charMap.rbegin();
++last;
for (auto iter = charMap.begin(); iter != charMap.end(); iter++)
{
std::cout << iter->first << ":\t" << iter->second;
if (iter == last.base())
std::cout << "\t//This is the last element.\n";
else
std::cout << "\n";
}
}
答案 4 :(得分:0)
丑陋。 。 。但是。 。 。
auto iterCpy = iter;
if (++iterCpy == charMap.end())
std::cout << "\t//This is the last element.\n";
使用vsoftco的答案:)
答案 5 :(得分:0)
实际上,由于iter
确实与charMap.rbegin().base()
不同,因此不会发生这种情况。
您的逻辑是正确的,唯一的问题是charMap.rbegin().base()
迭代器等于charMap.end()
,但您在iter
达到charMap.end()
值时保留for语句,所以它永远没有机会在for循环中的if语句中测试它。
要使其工作,您可以通过以下方式重写if语句:
if (iter->first == charMap.rbegin()->first)
std::cout << "\t//This is the last element.\n";
else
std::cout << "\n";
所以你将比较map键而不是迭代器本身。
答案 6 :(得分:0)
这是有效的:
#include <iostream>
#include <map>
int main()
{
std::map <char, int> charMap = { {'a', 1}, {'b', 2}, {'c', 3}, {'d', 4} };
for (auto iter = charMap.begin(); ;)
{
std::cout << iter->first << ":\t" << iter->second;
if (++iter== charMap.end()){
std::cout << "\t//This is the last element.\n"; break;
}
else
std::cout << "\n";
}
}