Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Шаблонная функция


Автор: Djen1k 12.11.2009, 23:45
Вот есть небольшая программка для шаблонной сортировки функции. Сортирует только вектора, требуется чтобы также сортиравала и массивы... Можно ли с  помощью одной шаблонной ф-ции сортировать сразу и массив и вектора? Или нужно для каждого тип данных свой шаблон? И можно ли этот шаблон переориентировать на сортировку массива?
Код

#include "stdafx.h"
#include <string>
#include "conio.h"
#include <iostream>
#include <vector>
#include <algorithm>
using std::vector;
using namespace std;


template< typename Iterator >
void cocktail_sort( Iterator first, Iterator last )
{
    for( --last; first < last; --last, ++first )
    {
        for( Iterator i = first; i < last; ++i )
            if ( *(i + 1) < *i )
                std::iter_swap( i, i + 1 );

        for( Iterator i = last - 1; i > first; --i )
            if ( *i < *(i - 1) )
                std::iter_swap( i, i - 1 );
    }
}


int _tmain(int argc, _TCHAR* argv[])
{vector<int> ivec;
ivec.push_back(5);
ivec.push_back(7);
ivec.push_back(2);
ivec.push_back(-9);
ivec.push_back(0);
cocktail_sort(ivec.begin() , ivec.end());


for (vector<int>::const_iterator iter = ivec.begin();
     iter != ivec.end(); ++iter)
{
    cout << *iter << " " << endl;
}
_getch ();
    return 0;
}


Автор: ller 13.11.2009, 00:02
Так итераторы должны работать и с вектором и с массивом

Автор: Djen1k 13.11.2009, 00:21
Действительно "указатели - итераторы для массивов" (С.Б.Липпман "Язык программирования С++ Вводный курс." Четвертое издание 2007) стр - 150.

Я просто сначала не разобрался что указатель - это и есть итератор...
Теперь чтобы отсортировать простой массив с помощью шаблонной функции нужно всего лишь его задать,передав функции указатель на начало и конец массива.Я сделал это так:
Код

const size_t arr_sz = 5;
int int_arr[arr_sz] = {0, 2, -9, 7, 8};
int *pbegin = int_arr;
int *pend = int_arr + arr_sz;
cocktail_sort(pbegin, pend);
for (; pbegin!= pend ;++pbegin)
{
    cout << *pbegin << ' ';
}



Тема исчерпала себя)
ller спасибо, что открыл глаза. smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)