Я пытаюсь написать функцию печати для набора в 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<<"}";
}
Но я получаю ошибку. Как я могу проверить, является ли текущий элемент последним элементом или нет?
Могу ли я предложить альтернативный подход?
Распечатайте запятую перед каждым элементом, кроме первого:
void print_set(set<int> &s)
{
cout << "{";
for(auto it = s.begin() ; it != s.end() ; ++it)
{
if(it != s.begin())
cout << ", ";
cout << *it;
}
cout << "}";
}
set
integers не являются случайным доступом, поэтому вы не можете делать арифметические действия на них. Вместо этого используйте std::prev
.
Просто проверьте, равен ли следующий элемент:
auto next = it;
++next;
if (next != s.end())
cout << ",";
auto next = it; ++next;
,
Что я делаю в этом случае:
void print_set(const std::set<int>& s)
{
const char* sep = "";
std::cout << "{";
for (int e : s)
{
std::cout << sep << e;
sep = ", ";
}
std::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
не будет точным, если набор пуст, но код будет работать, как ожидалось.
std::intercalate
для такого рода вещей, но я не смог найти ничего готового ...