检测迭代器是否是std :: map的最后一个元素

时间:2015-11-11 18:50:12

标签: c++ dictionary iterator std

这类似于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    

现在我意识到有更好的方法可以做到这一点,但我希望这也可以。为什么我无法比较itercharMap.rbegin().base()

7 个答案:

答案 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::prevhere上的图表说明了这一点。

您应该使用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";
    }

}