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

Checking if current element is last element of set

本文关键字:元素 最后一个 集合 是否是 检查      更新时间:2023-10-16

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

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<<"}";
}

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

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

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

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

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

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

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

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

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将不准确,但代码仍将按预期工作。

在这种情况下我

做什么:

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