вычесть последовательные элементы набора - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь реализовать установленную версию функции solLoops:

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <ctime>
#include <vector>
#include <algorithm>
#include <unordered_set>

int solLoops(std::vector<int> A)
{

    int count = 0;
    for (int i = 0; i < A.size() - 1; ++i)
    {
        if (A[i + 1] - A[i] <= 1)
        {
            count++;
        }
    }
    return count;
}

int solSet(std::vector<int> A)
{
    std::unordered_set<int> S;

    for (int i = 0; i  < A.size(); ++i)
    {
        S.insert(A[i]);
    }

    int count = 0;
    for (auto it = S.begin(); it != std::prev(S.end()); ++it)
    {
        auto it2 = std::next(it, 1);
        if (*it2 - *it <= 1)
        {   
            count++;
        }
    }

    return count;
}



int main() {

    const unsigned int N = 4;

    std::vector<int> A;
    A.reserve(N);
    A.emplace_back(11);
    A.emplace_back(12);
    A.emplace_back(13);
    A.emplace_back(1);
    A.emplace_back(2);

    //int result = solLoops(A);
    int result = solSet(A);
    std::cout << "Result is: " << result << "\n";
    std::cout << "\n";

    return 0;
}

но я получаю ошибку сегмента. Я пытаюсь реализовать цикл:

for (int i = 0; i < A.size() - 1; ++i)

по

for (auto it = S.begin(); it != std::prev(S.end()); ++it)

и сделайте вычитание:

if (A[i + 1] - A[i] <= 1)

как

auto it2 = std::next(it, 1); if (*it2 - *it <= 1)

(я знаю, что набор содержит элементы в случайном порядке. Я просто пытаюсь понять, как сделать вычитание здесь)

1 Ответ

0 голосов
/ 25 апреля 2018

std::unordered_set имеют вперед итераторы (которые могут идти только вперед). Но std::prev требует двунаправленный итератор .

Вы можете решить свою проблему, проверив, является ли итератор следующий концом или нет: std::next(it) != S.end(). Или вместо этого используйте std::set, которые имеют двунаправленных итераторов.

...