我正在尝试用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<<"}";
}
但我收到了错误。如何检查当前元素是否为最后一个元素?
答案 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 << "}";
}