Форум программистов, компьютерный форум CyberForum.ru

Обработка out_of_range - C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
Peperovich
43 / 43 / 4
Регистрация: 17.05.2011
Сообщений: 162
25.09.2013, 18:34     Обработка out_of_range #1
Всем привет.
Имеетмся матрица, реализованная как std::vector <std::vector <int>>. Мне нужно найти сумму всех соседних элементов для каждого элемента матрицы. В общем случае это сумма 8 элементов, но для граничных элементов это количество меньше. Как мне написав алгоритм для общего случая обрабатывать выход за границу, так чтобы при выходе за границу просто сситались след элементы.
Знаю есть vector <T>::at () , но как им пользоваться не понимаю.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.09.2013, 18:34     Обработка out_of_range
Посмотрите здесь:

Обработка массивов C++
Строки обработка C++
C++ Обработка строк
Обработка структур с++ C++
C++ Выскакивает out_of_range
Обработка массивов C++
C++ обработка матрицы
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4867 / 3006 / 370
Регистрация: 10.11.2010
Сообщений: 11,056
Записей в блоге: 10
Завершенные тесты: 1
26.09.2013, 12:55     Обработка out_of_range #21
Цитата Сообщение от Peperovich Посмотреть сообщение
Перегрузка оператора [] для std::vector? Для него же есть своя реализация перегрузки []. Какая из них будет вызываться?
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
#include <iostream>
#include <vector>
 
template <class T>
class A : public std::vector <T> {
public:
    T operator [] ( int index ) {
        if ( index < 0 || index >= static_cast<int>(std::vector<T>::size()) ) {
            std::cout << "out of range: ";
            return 0;
        }
        std::cout << "ok: ";
        return (*(std::vector<T> *)this)[index];
    }
};
 
int main()
{
    A <int> a;
    a.push_back( 123 );
    a.push_back( 200 );
    a.push_back( 500 );
    a.push_back( 9999 );
 
    std::cout << a[-1] << std::endl; // out of range: 0
    std::cout << a[ 0] << std::endl; // ok: 123
    std::cout << a[ 3] << std::endl; // ok: 9999
    std::cout << a[ 4] << std::endl; // out of range: 0
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
26.09.2013, 12:56     Обработка out_of_range #22
Peperovich, ну и как ты выйдешь вообще брейком вот код:
C++
1
2
3
4
5
for(int i=0;i<10;i++)
for(int j=0;j<10;j++)
for(int k=0;k<10;k++)
if(какое то условие)//нужно выйти полностью из всех циклов
break;//ты выйдешь токо из одного цикла.
тут можно переменную флаг использовать, можно goto, можно исключение и исключение красивый легко понятный вариант.
Peperovich
43 / 43 / 4
Регистрация: 17.05.2011
Сообщений: 162
26.09.2013, 13:04  [ТС]     Обработка out_of_range #23
Наследование сильная вещь =) Все больше и больше в этом убеждаюсь.

Добавлено через 4 минуты
Цитата Сообщение от ninja2 Посмотреть сообщение
Peperovich, ну и как ты выйдешь вообще брейком вот код:
C++
1
2
3
4
5
for(int i=0;i<10;i++)
for(int j=0;j<10;j++)
for(int k=0;k<10;k++)
if(какое то условие)//нужно выйти полностью из всех циклов
break;//ты выйдешь токо из одного цикла.
тут можно переменную флаг использовать, можно goto, можно исключение и исключение красивый легко понятный вариант.
Из всех циклов одним break понятно, что не выйдешь. А goto перестал пользоваться еще на Pascale. Лучше уж флаг.
castaway
Эксперт С++
4867 / 3006 / 370
Регистрация: 10.11.2010
Сообщений: 11,056
Записей в блоге: 10
Завершенные тесты: 1
26.09.2013, 13:08     Обработка out_of_range #24
Если позволяет ситуация то можно сделать просто.
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
 
int main()
{
    for(int i=0;i<10;i++)
    for(int j=0;j<10;j++)
    for(int k=0;k<10;k++) {
        std::cout << "i=" << i << ", j=" << j << ", k=" << k << std::endl;
        if ( k == 5 ) i = j = k = 10;
    }
}
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
26.09.2013, 13:12     Обработка out_of_range #25
Цитата Сообщение от Peperovich Посмотреть сообщение
Из всех циклов одним break понятно, что не выйдешь. А goto перестал пользоваться еще на Pascale. Лучше уж флаг.
а если этих циклов будет 10, ты что в каждом будешь проверять флаг? Мне кажется более компактно будет использовать исключение, код не замусорен будет и наглядно понятнее программа становиться.
Peperovich
43 / 43 / 4
Регистрация: 17.05.2011
Сообщений: 162
26.09.2013, 13:16  [ТС]     Обработка out_of_range #26
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
 
int main()
{
    int flag=0;
    for(int i=0;i<10 && flag==0;i++)
    for(int j=0;j<10 && flag==0;j++)
    for(int k=0;k<10 && flag==0;k++) {
        std::cout << "i=" << i << ", j=" << j << ", k=" << k << std::endl;
        if ( k == 5 ) flag=1;
    }
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.09.2013, 13:19     Обработка out_of_range
Еще ссылки по теме:

C++ Обработка исключений
Обработка файлов C++
C++ Обработка матрицы
Std::out_of_range C++
Обработка массива C++

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

Или воспользуйтесь поиском по форуму:
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
26.09.2013, 13:19     Обработка out_of_range #27
Peperovich, да можно и так.
Yandex
Объявления
26.09.2013, 13:19     Обработка out_of_range
Ответ Создать тему
Опции темы

Текущее время: 03:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru