检查当前元素是否是set的最后一个元素

时间:2014-02-20 11:29:26

标签: c++ stl iterator

我正在尝试用C ++编写一个set函数,这就是我写的:

void print_set(set<int> &s)
{
    cout<<"{";
    for(auto it = s.begin() ; it!=s.end() ; ++it)
    {
        cout<<*it;
        if(it!=(s.end()-1)) //shows error here
            cout<<",";
    }
    cout<<"}";
}

但我收到了错误。如何检查当前元素是否为最后一个元素?

5 个答案:

答案 0 :(得分:3)

set的整数不是随机访问,所以你不能对它们进行算术运算。请改用std::prev

答案 1 :(得分:3)

我可以建议另一种方法吗?

在每个元素之前打印逗号,但第一个元素除外:

void print_set(set<int> &s)
{
    cout << "{";
    for(auto it = s.begin() ; it != s.end() ; ++it)
    {
        if(it != s.begin())
            cout << ", ";
        cout << *it;
    }
    cout << "}";
}

答案 2 :(得分:2)

只需检查下一个元素是否等于结尾:

auto next = it;
++next;
if (next != s.end())
    cout << ",";

答案 3 :(得分:1)

您只能在set迭代器上应用++--运算符。未定义添加数字。您可以使代码像这样工作:

void print_set(set<int> &s)
{
    cout<<"{";
    auto second_to_last = s.end();
    if (!s.empty()) {
      second_to_last--;
    }
    for(auto it = s.begin() ; it!=s.end() ; ++it)
    {
        cout<<*it;
        if(it!=second_to_last) {
            cout<<", ";
        } 
    }
    cout<<"}";
}

这段代码的作用本质上是将迭代器存储到倒数第二个元素,然后比较你拥有的元素。请注意,如果设置为空,则second_to_last将无效,但代码仍将按预期工作。

答案 4 :(得分:1)

在这种情况下我做了什么:

void print_set(const std::set<int>& s)
{
    const char* sep = "";
    std::cout << "{";
    for (int e : s)
    {
        std::cout << sep << e;
        sep = ", ";
    }
    std::cout << "}";
}