Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
rikimaru2013
C++ Game Dev
2439 / 1133 / 240
Регистрация: 30.11.2013
Сообщений: 3,690
#1

Перегрузка std::end для двумерного массива - C++

06.07.2016, 21:40. Просмотров 294. Ответов 5
Метки нет (Все метки)

Добрый день,

1) почему если закомментировать переопределение функций begin, end работает, ведь там явно не одномерный, а стандартный begin/end имеет шаблонное определение размерности
2) почему не могу всё же переопределить для base_range for и некоторых STL алгоритмов

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
#include <algorithm>
#include <ctime>
#include <iostream>
using namespace std;
 
namespace std
{
 
    template <typename T, size_t M, size_t N>
    typename remove_all_extents<T>::type*
    begin( T( &array )[ M ][ N ] )
    {
        return begin( array[ 0 ] );
    }
 
    template <typename T, size_t M, size_t N>
    typename remove_all_extents<T>::type*
    end( T( &array )[ M ][ N ] )
    {
        return &array[ M-1 ][ N ];
    }
}
int main()
{
    const int sizeM = 2;
    const int sizeN = 3;
    srand( time( 0 ) );
 
    int arr[ sizeM ][ sizeN ];
 
    std::generate( std::begin( arr ), std::end( arr ), [](){ return rand() % 20 ;} );
 
    cout << endl;
    std::for_each( std::begin( arr ), std::end( arr ), []( int current ){ cout << current << " ";   } );
 
    for( auto& it : arr )
        cout << &it << " ";
 
    auto it = std::unique( std::begin( arr ), std::end( arr ), std::less<int>() );
    bool is = it == std::end( arr );
 
    cout << endl;
    std::for_each( it, std::end( arr ), []( int current ){ cout << current << " ";  } );
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.07.2016, 21:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перегрузка std::end для двумерного массива (C++):

Потокобезопасность std::map::end, std::list::end - C++
Собсна сабж, могу ли я без синхронизаций выполнять подобного рода код if (myIter != map.end()) // != list.end() {...} myIter =...

std::accumulate по столбцах двумерного массива - C++
Есть массив: const int n = 10; int v; Как найти сумму элементов его столбца используя STL?

Ошибка при передаче двумерного массива в функцию std::thread - C++
Здравствуйте! Написал программу на потоки, теперь нужно передать туда двумерный массив. Пытаюсь передать по ссылке, но каждый раз...

Перегрузка индексации двумерного динам. массива - C++
решил реализовать такое: обращение к эл-ту двумерного массива происходит следующим образом а, я решил перегрузить чтобы обращаться к...

Как реализован .end() std::map? - C++
Как реализован .end() std::map? Не понимаю, какая у него реализация. Либо он указывает на root дерева, либо на фиктивную ноду либо на что...

std::map и перегрузка оператора - C++
решил освоить стандартные контейнеры и очередь за &quot;map&quot; нахожу на http://en.cppreference.com/w/cpp/container/map замороченный код,...

5
Хрисипп
19 / 29 / 8
Регистрация: 09.02.2016
Сообщений: 217
06.07.2016, 23:49 #2
но вывод-то разный? и что это за компилятор такой?
0
nonedark2008
931 / 670 / 147
Регистрация: 28.07.2012
Сообщений: 1,827
07.07.2016, 01:13 #3
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
и некоторых STL алгоритмов
Предположу, что некоторые STL алгоритмы хавают внутри себя iterator_traits...

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
почему если закомментировать переопределение функций begin, end работает, ведь там явно не одномерный, а стандартный begin/end имеет шаблонное определение размерности
Можно по внятнее и поподробнее про проблему?

Добавлено через 22 минуты
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
почему не могу всё же переопределить для base_range for
Ну, похоже компилятор для массивов реализует base range for отдельно от STL.
Это подтверждается тем, что его можно использовать без подключения каких-либо заголовков.
В интернете винят во всем ADL.
1
avgoor
915 / 550 / 119
Регистрация: 05.12.2015
Сообщений: 1,531
07.07.2016, 01:54 #4
rikimaru2013, Потому, что это UB:
17.6.4.2.1 Namespace std
1
The behavior of a C++ program is undefined if it adds declarations or definitions to namespace std or to a namespace within namespace std unless otherwise specified. A program may add a template specialization for any standard library template to namespace std only if the declaration depends on a user-defined type and the specialization meets the standard library requirements for the original template and is not explicitly prohibited.
2
GbaLog-
07.07.2016, 08:28
  #5

Не по теме:

Цитата Сообщение от Хрисипп Посмотреть сообщение
и что это за компилятор такой?
Любой компилятор из самых известных(g++,clang,vc++) скомпилирует этот код, к чему этот вопрос вообще?

0
nonedark2008
07.07.2016, 11:07     Перегрузка std::end для двумерного массива
  #6

Не по теме:

Цитата Сообщение от GbaLog- Посмотреть сообщение
Любой компилятор из самых известных(g++,clang,vc++) скомпилирует этот код, к чему этот вопрос вообще?
К тому, что как и сказал avgoor, это UB.
И на разных компиляторах это может работать по разному, либо вовсе не работать.
Это видно хоть по тому, что для range based for перегруженные методы не вызываются вовсе, хотя по логике должны.

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.07.2016, 11:07
Привет! Вот еще темы с ответами:

Операция std::cout для Объекта типа std::string - C++
Кто детально объяснит почему не выводит ? Дает вот так &quot;Отсутствует оператор &quot;&lt;&lt;&quot;, соответствующий этим операндам&quot; void...

Найти номер строки и столбца двумерного массива для минимального элемента этого массива - C++
Visual C ++ 2005 Express Edition помогите пожалуйста

Метод-член класса для создания одномерного массива из отрицательных элементов двумерного динамического массива - C++
Помогите, пожалуйста, нужно разработать метод-член класса для создания одномерного массива из отрицательных элементов двумерного...

Сортировка строк двумерного std::vector'а в лексикографическом порядке - C++
Позвольте узнать... Возможно ли через vector&lt;vector&lt;double&gt;&gt; и функцию std::sort() отсортировать строки массива в лексикографическом...


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

Или воспользуйтесь поиском по форуму:
6
07.07.2016, 11:07
Ответ Создать тему
Опции темы

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