Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 15.09.2018
Сообщений: 133
1

Как вызвать исключение выхода за пределы контейнера stl ?

16.01.2019, 11:03. Показов 1686. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
template<typename T>
void stl(list<T> _c, int _b)
{
    system("cls");
    list<T> a;
    char w;
    T d;
    while (1)
    {
 
        cout << endl << "Select the appropriate command in the range from 1 to 10:" << endl;
        cout << "1-push to end of list" << endl << "2-push to the top of the list" << endl << "3-Show list" << endl << "4-delete item from list" << endl
            << "5-clear list" << endl << "6-Reverse elements" << endl << "7-Find out the size of list"
            << endl << "8-Remove matching items in the list" << endl << "9-Insert item in the list" << endl <<"10-exit"<<endl;
        w = enter_int();
        switch (w)
        {
        case 1:
        {
            rewind(stdin);
            cin >> d;
            a.push_back(d);
            system("cls");
            cout << "Object successfully pushed" << endl;
            break;
        }
        case 2:
        {
            rewind(stdin);
            cin >> d;
            a.push_front(d);
            system("cls");
            cout << "Object successfully pushed" << endl;
            break;
        }
        case 3:
        {
            system("cls");
            print_table(_b);
            list<T>::iterator it;
            for (it = a.begin(); it != a.end(); it++)
            {
                cout << (*it);
                cout << endl;
            }
            break;
        }
        case 4:
        {
            system("cls");
            print_table(_b);
            list<T>::iterator it;
            for (it = a.begin(); it != a.end(); it++)
            {
                cout << (*it);
                cout << endl;
            }
            cout << "Enter the name of the item you want to delete." << endl;
            string t;
            cin >> t;
            for (it = a.begin(); it != a.end(); it++)
            {
                if ((it->GetName()) == t)
                {
                    a.erase(it);
                    system("cls");
                    cout << "Object deleted" << endl;
                    break;
                }
            }
            break;
        }
        case 5:
        {
            system("cls");
            a.clear();
            cout << "list cleared" << endl;
            break;
        }
        case 6:
        {
            system("cls");
            a.reverse();
            cout << "Reverse list" << endl;
            break;
        }
        case 7:
        {
            system("cls");
            int i;
            i = a.size();
            cout << "The size list = " << i << endl;
            break;
        }
        case 8:
        {
            system("cls");
            a.unique();
            cout << "Matching items removed" << endl;
            break;
        }
        case 9:
        {
            rewind(stdin);
            cin >> d;
            cout << "Enter position to insert item." << endl;
            int i, kl = 0;
            cin >> i;
            list<T>::iterator it;
            for (it = a.begin(); it != a.end(); it++)
            {
                kl++;
                if (kl == i)
                {
                    a.insert(it, d);
                    break;
                }
            }
            cout << "Item pushed" << endl;
            break;
        }
        case 10:
        {
            return;
        }
        }
     }
    }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.01.2019, 11:03
Ответы с готовыми решениями:

МОЖНО ли вызвать исключение выхода за пределы контейнера list (STL) ?
или контейнер list ходит по кругу и в этом случае не может произойти выход за его пределы ?

Как вынести за пределы контейнера из col
Есть задача вынести картинку за пределы контейнера. Дело в том что сайт на open cart и там куча...

Как скрывать блоки, которые перемещаются за пределы контейнера?
Доброго времени суток! Помогите, пожалуйста, решить задачу. Я вставил в контейнер div, от левой...

Как вызвать метод объекта из контейнера?
Есть абстрактный класс E, производный от CObject, в нем чистая виртуальная войдовская функция....

9
322 / 174 / 78
Регистрация: 09.10.2014
Сообщений: 809
16.01.2019, 11:19 2
Всмысле throw std::out_of_range();?
0
610 / 415 / 151
Регистрация: 11.01.2019
Сообщений: 1,746
16.01.2019, 11:24 3
Цитата Сообщение от danila-2000 Посмотреть сообщение
Как вызвать исключение выхода за пределы контейнера stl ?
Не понял смысла задачи. Вы ходите проверить валидность итераторов или что?
0
243 / 268 / 219
Регистрация: 14.11.2016
Сообщений: 1,043
16.01.2019, 11:31 4
никак, список замкнутый, iterator гуляет по кругу (т.е. it = list.end(); ++it; то it будет уже указывать на начало списка). А индексации какой-либо у него нет, чтобы можно было выйти за пределы, например, при вставке какого-то элемента указать индекс на несуществующий элемент - увы, нельзя.
0
447 / 333 / 172
Регистрация: 01.07.2015
Сообщений: 1,162
16.01.2019, 22:35 5
Цитата Сообщение от anapshy Посмотреть сообщение
никак, список замкнутый, iterator гуляет по кругу
На словах должно вывести 1

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <vector>
 
using namespace std;
 
int main() {
  vector<int> a = { 1, 2, 3, 4, 5 };
 
  auto it = a.cend();
 
  ++it;
 
  cout << *it;
}
На деле: can't increment vector iterator past end
0
610 / 415 / 151
Регистрация: 11.01.2019
Сообщений: 1,746
16.01.2019, 22:46 6
Цитата Сообщение от ReDoX Посмотреть сообщение
На деле: can't increment vector iterator past end
Точнее "debug assertion failed" в отладочной конфигурации.
0
243 / 268 / 219
Регистрация: 14.11.2016
Сообщений: 1,043
17.01.2019, 10:28 7
Цитата Сообщение от ReDoX Посмотреть сообщение
На словах должно вывести 1
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
#include <vector>
using namespace std;
int main() {
* vector<int> a = { 1, 2, 3, 4, 5 };
auto it = a.cend();
++it;
cout << *it;
}
На деле: can't increment vector iterator past end
говорил о list, а не о vector
Цитата Сообщение от anapshy Посмотреть сообщение
никак, список замкнутый, ...
0
447 / 333 / 172
Регистрация: 01.07.2015
Сообщений: 1,162
17.01.2019, 10:42 8
Цитата Сообщение от anapshy Посмотреть сообщение
говорил о list, а не о vector
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <list>
 
using namespace std;
 
int main() {
  list<int> a = { 1, 2, 3, 4, 5 };
 
  auto it = a.cend();
 
  ++it;
 
  cout << *it;
}
Вывод: cannot increment end list iterator. Или я что-то не так сделал?
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
17.01.2019, 13:25 9
Использование итератора end не по назначению приведет к неопределенному поведению.

Однако, список может быть построен таким образом, что сам список является узлом, и таким образом список оказывается закольцованным. Абстрактный пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <iostream>
#include <string>
 
struct list_node_base //Базовый узел, который содержит два указателя на соседние узлы
{
    list_node_base * next;
    list_node_base * prev;
};
 
template<typename T>
struct list_node: list_node_base //Узел целевого типа добавляет данные к базовому узлу
{
    list_node(T const & src): data(src) {
    }
    T data;
};
 
 
template<typename T>
struct list: list_node_base //Список является узлом самого себя, но без данных
{
    struct iterator {
        T & operator*() {
            return get_pointer()->data;
        }
        T * operator->() {
            return &get_pointer()->data;
        }
        bool operator!=(iterator const & rhv) {
            return p != rhv.p;
        }
        list_node<T> * get_pointer() {
            return static_cast<list_node<T>*>(p);
        }
        iterator & operator++() {
            p = p->next;
            return *this;
        }
 
        list_node_base * p;
    };
 
    list(): list_node_base{this, this} {//Список в начальном состоянии состоит из одного узла - самого списка
    }
 
    void push(T const & v) {
        list_node_base * p = new list_node<T>{T(v)};
        prev->next = p;//this->next исправится автоматически при вставке первого элемента
        p->prev = prev;
        p->next = this;//Элемент следующий за последним - сам список
        prev = p;
    }
 
    iterator begin() {
        return iterator{next};//На первый узел указывает next
    }
 
    iterator end() {
        return iterator{this};//Сам список и является узлом end
    }
};
 
 
int main()
{
    list<std::string> lst;
    lst.push("some");
    lst.push("unknown");
    lst.push("word");
    auto current = lst.begin();
    for(unsigned i = 0; i < 10; ++i) {
        if (current != lst.end()) {//Чтобы не разыменовать end
            std::cout << *current << std::endl;//ведь в нем нет члена data
        }
        ++current;//Для нашей реализации это валидно даже для end
    }
}
https://rextester.com/JBC22118

В данном списке все узлы, кроме одного, содержат член data. Этот "особенный" узел содержит нужные указатели на первый и последний элементы списка, и является основой итератора end. Так как в этом узле нет члена data, то get_pointer()->data в итераторе приведет к неопределенному поведению.

Такие списки достаточно просты и удобны в реализации. Подобным способом реализован список в gcc:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//g++  5.4.0
 
#include <iostream>
#include <string>
#include <list>
 
int main()
{
    std::list<std::string> lst;
    lst.push_back("some");
    lst.push_back("unknown");
    lst.push_back("word");
    auto current = lst.begin();
    for(unsigned i = 0; i < 10; ++i) {
        if (current != lst.end()) {
            std::cout << *current << std::endl;
        }
        ++current;
    }
}
https://rextester.com/VMNO65384
0
1536 / 456 / 101
Регистрация: 17.05.2015
Сообщений: 1,424
17.01.2019, 15:41 10
Вот это:

Цитата Сообщение от anapshy Посмотреть сообщение
никак, список замкнутый, iterator гуляет по кругу (т.е. it = list.end(); ++it; то it будет уже указывать на начало списка). А индексации какой-либо у него нет, чтобы можно было выйти за пределы, например, при вставке какого-то элемента указать индекс на несуществующий элемент - увы, нельзя.
И вот это:

Цитата Сообщение от anapshy Посмотреть сообщение
говорил о list, а не о vector
бред.
0
17.01.2019, 15:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.01.2019, 15:41
Помогаю со студенческими работами здесь

Как реализовать вычисления по формуле без ошибки выхода за пределы массива?
Пытаюсь реализовать формулу. Выдает ошибку:Индекс находился вне границ массива. int s; ...

Stl map: Как вызвать деструктор мапа
1) как вызвать деструктор мапа?)) 2) если мап хранит класс он вызовит его деструктор при своём...

Из STL контейнера
Из STL контейнера создать 3-х мерный массив и класс который содержит этот 3-х мерный массив и вывод...

Как обойти исключение выхода за диапазон при чтении из файла в GridView?
Здравствуйте! Подскажите в чем ошибка? Выдает исключение индекс за пределами диапазона в 26 и 32-й...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru