c++ list iterator is not dereferencable

185
24 февраля 2018, 22:15

Есть отсортированный по алфавиту список с фамилиями, содержащийся в

class Stud {
    string name; 
    string group; 
    list<int> balls;
};

Нужно вывести сведения о студентах, фамилии которых начинаются на заданную букву вот функциональные классы:

class Letter {
    char c;
public:
    Letter(char c) {
        this->c = c;
    }
    bool operator ()(Stud &m) {
        return m.name[0] == c;
    }
};
class NotLetter{
    char c;
public:
    NotLetter(char c) {
        this->c = c;
    }
    bool operator ()(Stud& m) {
        return m.name[0] != c;
    }
};

А вот алгоритм поиска фамилий на Д . data- объект класса Student

w = find_if(data.begin(), data.end(), Letter('Д'));
    if (w == data.end())
    cout << endl<<"Нет фамилий на заданную букву" << endl;
    else {
        cout << endl;
        r = find_if(data.begin(), data.end(), NotLetter('Д'));
        for (t = w; t !=r; t++) {
            cout << *t ;
        }       
    }   

При разыменовании итератора выдает ошибку.Пожалуйста, помогите найти

#include <iostream>
#include <iomanip>
#include <list>
#include <algorithm>
#include<string>
#include <iterator>
using namespace std;class Stud {
public:
    string name;
    string group;
    list <int> balls;
    Stud() {
        name = "\0"; group = "\0"; list <int> balls; ;
    }
    Stud(const string & an, const string & ag, const list<int> ab) {
        name = an;
        group = ag;
        balls = ab;
    }
    friend ostream& operator<< (ostream &os, Stud& st) {
        os << st.name << setw(10) << st.group << setw(4);
        list<int>::iterator p = st.balls.begin();
        while (p != st.balls.end()) {
            cout << *p << " ";
            p++;
        }
        os << endl;
        return os;
    }
};
bool bySurname(Stud &c1, Stud &c2) {
    return (c1.name< c2.name);
}
class Letter {
    char c;
public:
    Letter(char c) {
        this->c = c;
    }
    bool operator ()(Stud &m) {
        return m.name[0] == c;
    }
};
class NotLetter {
    char c;
public:
    NotLetter(char c) {
        this->c = c;
    }
    bool operator ()(Stud& m) {
        return m.name[0] != c;
    }
};
void print(list<Stud> &data) {
    list<Stud> ::iterator ptr = data.begin();
    while (ptr != data.end()) {
        cout << *ptr;
        ptr++;
    }
}
int main()
{
    setlocale(LC_ALL, ".1251");
    list <Stud> data;
    Stud m("Иванов", "2а", { 1,3,4,5 });
    Stud b("Дугинов", "3г", { 2,6,9,3,9 });
    Stud p("Белов", "5г", { 9,6,6,3 });
    data.push_back(m);
    data.push_back(b);
    data.push_back(p);
    data.sort(bySurname);
    print(data);
    cout << endl << "Фамилии на Д:";
    list<Stud> ::iterator w, r, t;
    w = find_if(data.begin(), data.end(), Letter('Д'));
    if (w == data.end())
        cout << endl << "Нет фамилий на заданную букву" << endl;
    else {
        cout << endl;
        r = find_if(data.begin(), data.end(), NotLetter('Д'));
        for (t = w; t != r; t++) {
            cout << *t;
        }
    }
    system("pause");
    return 0;
}
Answer 1

Главная беда - тут:

r = find_if(data.begin(), data.end(), NotLetter('Д'));
for (t = w; t != r; t++) {
    cout << *t;
}

Смотрите - вы нашли на Д, а потом ищете НЕ Д, но этот элемент оказывается, увы, ДО найденного элемента. Так что до t == r вы никак добраться не можете, и гоните подряд всякий мусор на экран...

Если уж вы хотите именно так - то сделайте хотя бы поиск от найденного элемента:

r = find_if(w, data.end(), NotLetter('Д'));
for (t = w; t != r; t++) {
    cout << *t;
}
READ ALSO
Visual Studio пересечение заголовочных файлов

Visual Studio пересечение заголовочных файлов

Имеется простой проект DxЯ подключаю заголовочный и библиотеку

190
Qt QCameraViewfinder

Qt QCameraViewfinder

Возможно ли как-то добавить классу QCameraViewfinder через сигнал или слот on_click как у обычной кнопки?

154