Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.10.2014, 21:25   #1
БалаШагаЛ
Форумчанин
 
Регистрация: 11.02.2011
Сообщений: 131
По умолчанию Определение типа хранимой величины по итератору

Здравствуйте! Нужно реализовать сортировку чтобы, как в STL, в функцию передавались итераторы начала и конца. Но сортировка слиянием, так что нужно выделять дополнительную память, а для этого нужно знать тип хранимой величины. Есть ли какие-то способы узнать его?
Пробовал делать хотя бы вот такую штуку:
Код:
template <class value_type>
void mergeSort(typename vector<value_type>::iterator begin, typename vector<value_type>::iterator end);
Но при применении такой функции компилятор не может найти автоматически аргумент шаблона (если указываю явно, то всё компилируется хорошо).
Подумываю о вот такой записи:
Код:
template <class container, class value_type>
void mergeSort(typename container<value_type>::iterator begin, typename containter<value_type>::iterator end);
но это, боюсь, тоже вряд ли взлетит.
БалаШагаЛ вне форума Ответить с цитированием
Старый 14.10.2014, 00:14   #2
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

Код:
#include <iostream>
#include <vector>

using namespace std;

template <class Iterator>
void foo(Iterator it) {
	typename iterator_traits<Iterator>::value_type val;
	val = *it;
	cout << val << endl;
}

int main() {
	vector<int> v = { 123 };
	foo(v.begin());
	return 0;
}
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 14.10.2014, 11:53   #3
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Код:
#include <iostream>
#include <vector>

using namespace std;

template<class Iterator> void foo(Iterator it) 
{
   typedef typename Iterator::value_type
       Element;

    const Element& val = *it;
    cout << val << endl;
}

int main() 
{
    vector<int> v = { 123 };
    foo(v.begin());
    return 0;
}

Последний раз редактировалось _Bers; 14.10.2014 в 12:00.
_Bers вне форума Ответить с цитированием
Старый 14.10.2014, 12:24   #4
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

а этот способ позволяет вытаскивать данные из любых итераторов, не обязательно стл-совместимых.

главное, что б умели разыменовываться:


Код:
#include <type_traits>
#include <iostream>
#include <vector>

using namespace std;

template<class Iterator> void foo(Iterator it) 
{
   typedef decltype(*it)
       Ty;
    
   typedef typename remove_reference<
               typename remove_const<Ty>::type 
           >::type 
       Element;

    const Element& val = *it;
    cout << val << endl;
}

int main() 
{
    vector<int> v = { 123 };
    foo(v.begin());
    return 0;
}
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Определение типа. lawliet93 C# (си шарп) 2 08.02.2012 16:35
Присвоить итератору число RIO Общие вопросы C/C++ 2 04.12.2010 00:50
Определение типа ячейки. StudentofSUSU Microsoft Office Excel 4 08.01.2010 02:09
определение типа Mikimaus Общие вопросы C/C++ 6 22.11.2009 17:12