Проверка, является ли текущий элемент последним элементом множества

0

Я пытаюсь написать функцию печати для набора в 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<<"}";
}

Но я получаю ошибку. Как я могу проверить, является ли текущий элемент последним элементом или нет?

  • 0
    всегда предоставлять полное неизмененное сообщение об ошибке.
  • 0
    Вы могли бы подумать, что есть что-то вроде алгоритма std::intercalate для такого рода вещей, но я не смог найти ничего готового ...
Показать ещё 2 комментария
Теги:
iterator
stl

5 ответов

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 << "}";
}
  • 0
    Только убрал очевидную опечатку, надеюсь, вы не возражаете
  • 0
    @IvayloStrandjev Совсем нет, спасибо.
Показать ещё 4 комментария
3

set integers не являются случайным доступом, поэтому вы не можете делать арифметические действия на них. Вместо этого используйте std::prev.

2

Просто проверьте, равен ли следующий элемент:

auto next = it;
++next;
if (next != s.end())
    cout << ",";
  • 2
    Это приводит к увеличению его, что портит логику цикла.
  • 1
    Да, соответствующий код будет auto next = it; ++next; ,
Показать ещё 1 комментарий
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 << "}";
}
1

Вы можете применять только ++ и -- операторы к установленным итераторам. Добавление номера не определено. Вы можете заставить свой код работать так:

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 не будет точным, если набор пуст, но код будет работать, как ожидалось.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню