1 | |||||||||||
STL Iterators07.08.2012, 19:13. Показов 2479. Ответов 21
Метки нет (Все метки)
Допустим есть проект
ContainerTemplateFunction_hpp
main.cpp
Хочется чтобы в ContainerTemplateFunction.hpp было не 3 шаблона для каждого контейнера отдельно, а один шаблон... как сделать совместный шаблон для вектора и листа более менее понятно как сделать чтобы для карты (мап ) (map) вместе с вектором и листом был один шаблон (ну типа там же 2 аргумента а не один для как для листа и вектора ) подскажите плиз ) Заранее спасибо !
0
|
07.08.2012, 19:13 | |
Ответы с готовыми решениями:
21
Vector iterators incompatible iterators & file Map/set iterators are incompatible Оибка vector iterators incompatible ? |
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||||||
07.08.2012, 19:42 | 2 | |||||
Че-нить типа такого можно намутить.
Или сделать функцию от двух итераторов, но все равно нужно будет некое подобие перегрузок функции get_el.
1
|
4773 / 2582 / 894
Регистрация: 29.11.2010
Сообщений: 5,590
|
||||||
07.08.2012, 22:39 | 3 | |||||
Функция от двух итераторов самое то. Уже есть, конечно, std::accumulate, но можно и навелосипедить.
1
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
07.08.2012, 23:56 | 4 |
lemegeton, Ну accumulate-то да конечно.
1
|
09.08.2012, 18:58 [ТС] | 5 | |||||
Что то как всего много...
Короче задание звучит так В задании посказка как надо делать : Создайте темплейт функцию назовите ее Sum() которая принимает темплейт аргумент как импут и возвращает double. Темплейт аргумент будет контейнер. В инплементации гет итерейтер ((T::const_iterator)) для конца. Затем создайте цикл который будет итерейтить контейнер T и складывать все элементы. В финале ретернте сумму (return sum ) В мейне вызовете Sum() функциию для разных контейнеров вектор лит карта Sum() функция вычисляет сумму комплит контейнера. Так же создайте Sum() функцию которая вычисляет сумму между двумя итераторами. И функцию которая использует темплейт аргумент для итерации типа и доступа к друм итераторам старт и конец итератор... Блин по русски как то криво звучит вообщем вот оригинал
0
|
09.08.2012, 19:45 | 7 | |||||
1
|
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
|
|
09.08.2012, 19:50 | 8 |
Сообщение было отмечено как решение
РешениеУроки литературного перевода
Используя итераторы, мы можем перемещаться по контейнеру STL, ничего не зная о самом контейнере. В этом упражнении вам предлагается реализовать функцию, вычисляющую сумму элементов типа double, хранимых в контейнере.
5
|
09.08.2012, 20:11 [ТС] | 9 | ||||||||||
1>------ Build started: Project: L7_ex2_from_forum, Configuration: Debug Win32 ------ 1> main.cpp 1>main.cpp(43): error C2552: 'My_SumTest_Map' : non-aggregates cannot be initialized with initializer list 1> 'std::map<_Kty,_Ty>' : Types with a base are not aggregate 1> with 1> [ 1> _Kty=int, 1> _Ty=double 1> ] ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== Добавлено через 8 минут
errors
1>------ Build started: Project: L7_ex2_from_forum, Configuration: Debug Win32 ------
1> main.cpp main.cpp(15): error C2677: binary '+=' : no global operator found which takes type 'std:air<_Ty1,_Ty2>' (or there is no acceptable conversion) 1> with 1> [ 1> _Ty1=const double, 1> _Ty2=double 1> ] 1> main.cpp(36) : see reference to function template instantiation 'double Sum<std::_Tree_iterator<_Mytree>>(Iterator,Iterator)' being compiled 1> with 1> [ 1> _Mytree=std::_Tree_val<std::_Tmap_traits<double,double,std::less<double>,std::al locator<std:air<const double,double>>,false>>, 1> Iterator=std::_Tree_iterator<std::_Tree_val<std::_Tmap_traits<double,double,std: :less<double>,std::allocator<std:air<const double,double>>,false>>> 1> ] ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== для map не работает
0
|
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
|
||||||
09.08.2012, 20:29 | 10 | |||||
Естественно, потому что итератор по map по operator* возвращает пары, а не единичные значения. Они органически несовместимы.
Как решать? Да что-то ничего умнее и красивее адаптера в голову не приходит. Он позволит совместить несовместимое:
2
|
09.08.2012, 20:43 [ТС] | 11 | ||||||||||
Блин спасибо конечно большое!!! это вообще код героя 80 уровня ... Но блин по заданию там должен быть один аргумент that accepts the template argument T as input and returns a double. НЕ argumentS, а the argument... Короче походу накосячали с составлением задания что то я смотрю не кто не делает чтоб мап вектор и лист в одном темплейте был... короче как сделать чтоб вектор и лист был в одном темплейте и принимал аргумент контейнер тут был хороший вариант спасибо товарищу ! Но как это объединить в один темплейт спасибо товарищу !
Или вот допустим то что я нахреначил, как сделать так чтоб это один был тимплейт (лучше конечно этот переделать) то на что меня хватило пока
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|||||||||||
09.08.2012, 20:57 | 12 | ||||||||||
Leeto, Это и есть 1 темплейт. Для любого контейнера он используется. Разнится только функция получения элемента, что логично, потому как итератор мапы указывает на
Добавлено через 8 минут
1
|
09.08.2012, 21:06 [ТС] | 13 | |||||
main
error
1>------ Build started: Project: L7_ex2_one_template, Configuration: Debug Win32 ------ 1> main.cpp 1>\main.cpp(26): error C2668: 'get_el' : ambiguous call to overloaded function 1> main.cpp(12): could be 'double get_el<_Kty,_Ty,c_iter>(Iterator,const std:air<_Ty1,_Ty2> &)' 1> with 1> [ 1> _Kty=int, 1> _Ty=double, 1> Iterator=c_iter, 1> _Ty1=const int, 1> _Ty2=double 1> ] 1> \main.cpp(6): or 'double get_el<c_iter>(Iterator,const std:air<_Ty1,_Ty2> &)' 1> with 1> [ 1> Iterator=c_iter, 1> _Ty1=const int, 1> _Ty2=double 1> ] 1> while trying to match the argument list '(c_iter, const std:air<_Ty1,_Ty2>)' 1> with 1> [ 1> _Ty1=const int, 1> _Ty2=double 1> ] 1> \main.cpp(42) : see reference to function template instantiation 'double sum<std::map<_Kty,_Ty>>(const Container &)' being compiled 1> with 1> [ 1> _Kty=int, 1> _Ty=double, 1> Container=std::map<int,double> 1> ] ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== у меня одного этот код не компелируется ?
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
09.08.2012, 21:17 | 14 |
Leeto, В VS тоже не работает... Ща придумаю что-нибудь.
1
|
09.08.2012, 21:26 [ТС] | 15 | ||||||||||
Осталось разобраться с суммой между контейнерами
update code : main
сейчас это выглядит вот так
Also create a Sum() function that calculates the sum between two iterators. The function then uses the template argument for the iterator type and accepts two iterators, the start and end iterator ща перевод найду он где то вверху был Добавлено через 1 минуту вот перевод литературный ))) спасибо товарищу Также реализуйте Sum(), которая бы вычисляла сумму элементов между двумя итераторами. Шаблонный тип функции будет типом двух принимаемых итераторов, указывающих на начало и конец суммируемого региона
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||||||
09.08.2012, 21:31 | 16 | |||||
Как вариант.
1
|
4773 / 2582 / 894
Регистрация: 29.11.2010
Сообщений: 5,590
|
||||||
10.08.2012, 19:08 | 18 | |||||
Сообщение было отмечено как решение
Решение
Для красоты и универсальности можно подправить несколько деталей.
Не нужный скопированный код перегруженной ф-ции sum. Для универсальности, адаптер все-таки нужен. Для простоты можно ввести в виде предиката.
4
|
4773 / 2582 / 894
Регистрация: 29.11.2010
Сообщений: 5,590
|
|
11.08.2012, 00:49 | 20 |
1
|
11.08.2012, 00:49 | |
11.08.2012, 00:49 | |
Помогаю со студенческими работами здесь
20
Программа аварийно завершается с ошибкой "map/set iterators are incompatible" vector(выскакивает ошибка "vector iterators incompatible") STL STL STL STL Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |