Почему с итераторами не сортируется и вылетает?

296
15 декабря 2016, 16:14

Помогите разобраться с итераторами. Почему с итераторами не сортируется и вылетает?

#include <iostream>
#include <vector>
#include <conio.h>
#include <time.h>
using namespace std;
int main()
{
    setlocale(LC_ALL, "RUS");
    vector <int> arr;
    srand(time(NULL));
    for (int i = 0; i <= 10; i++)
    {
        arr.push_back(rand() % 9);
    }
    cout << "Вектор заполнен случайными числами!" << endl;
    //начальный элемент
    vector<int>::iterator it_begin = arr.begin();
    //текущий
    vector <int>::iterator current;
    vector <int>::iterator next;
        cout << "######################" << endl;
        for (current = arr.begin(); current != arr.end(); current++)
        {
            cout << *current << endl;
        }
        cout << "######################" << endl;
        int temp;
        vector<int>::iterator iteri;
        vector<int>::iterator iterj;
        iteri = arr.begin();
        iterj = arr.end() - 1;
        cout << *iterj;
        for (int i = 0; i<10; i++)
        {
            while (iteri != arr.end())
            {
                while (iterj>iteri)
                {
                    if (*(iterj - 1)>*iterj)
                    {
                        temp = *iterj;
                        *(iterj - 1) = *iterj;
                        *iterj = temp;
                    }
                    iterj++;
                }
                iteri++;
            }
        }
        /*
    for (current = arr.begin(); current<arr.end(); ++current)
            for (next = current + 1; next < arr.end(); ++next)
                if (current>next)
                {
                    temp = *current;
                    *current = *next;
                    *next = temp;
                }
*/
    cout << "######################" << endl;
    system("pause");
}
Answer 1

Проблема в строках

*temp = *current;
*current = *next;
*next = *temp;

Вы пытаетесь использовать итератор не для того, для чего он нужен.

Пишите так

temp = *current;
*current = *next;
*next = temp;

Либо добавьте #include <algorithm> и пишите так

swap(*current, *next);
Answer 2

Можно iter_swap() использовать. Примеры реализации классических алгоритмов сортировки на современном C++: How to implement classic sorting algorithms in modern C++?.

READ ALSO
Алгорифм Маркова

Алгорифм Маркова

Подскажите, пожалуйста, встречали ли вы шаблоны к алгорифмам Маркова? Если да, то дайте ссылку на источник

265
Указатель на указатель - что это?

Указатель на указатель - что это?

Часто встречаю вот такую конструкцию:

226
Указатели c++

Указатели c++

В C# я мог использовать свои объекты следующим образом:

250
Односвязный список с++

Односвязный список с++

Написал программу для создания односвязного списка

257