lazybones's blog

By lazybones, history, 6 years ago, In Russian

Задача: Вывести каждый k-элемент set, начиная с какого-то. Если начинать с начала, то всё хорошо:

#include <bits/stdc++.h>

using namespace std;

int main()
{

    set <int> a;
    for (int i = 1; i<=10; i++)
    {
        a.insert(i);
    }

    /**< Выводим все значения на нечётных позициях, начиная с первого элемента */
    for (auto it = a.begin(); it != a.end(); advance(it, 2))
    {
        cout << *it << ' ';
    }
    cout<<endl;

}

Если сдвигаю вывод, то вывод зацикливается при некоторых позициях сдвига и размере сдвига.

ЭТО ПОВИСНЕТ:

#include <bits/stdc++.h>

using namespace std;

int main()
{

    set <int> a;
    for (int i = 1; i<=10; i++)
    {
        a.insert(i);
    }

    /**< Если нужно начинать не с первого то */
    auto it = a.begin();
    advance(it, 1);
    for (it ; it != a.end(); advance(it, 2))
    {
        cout << *it << ' ';
    }
}

Я так понимаю программа зацикливается из-за того, что итератор никогда не становится равным a.end(), у кого есть знания, как такое можно записать правильно?

Единственное, что смог придумать — завел переменную, в которой держал "текущий номер" элемента set.

#include <bits/stdc++.h>

using namespace std;

int main()
{

    set <int> a;
    for (int i = 1; i<=10; i++)
    {
        a.insert(i);
    }

    /**< Если нужно начинать не с первого, то */
    auto it = a.begin();
    advance(it, 1);
    int i = 1;
    for (it ; it != a.end(); advance(it, 2))
    {
        i +=2;
        if (i>a.size())
        {
            break;
        }
        cout << *it << ' ';

    }

}

Tags set
  • Vote: I like it
  • 0
  • Vote: I do not like it