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

Передать итератор на шаблонный вектор в функцию - C++

Восстановить пароль Регистрация
 
R_e_n
0 / 0 / 0
Регистрация: 30.07.2012
Сообщений: 35
03.11.2013, 00:13     Передать итератор на шаблонный вектор в функцию #1
Здравствуйте.

Есть два вектора
C++ (Qt)
1
2
std::vector<Player> players; //  Player - структура с двумя полями
std::vector<size_t> indices;
Я хочу написать функцию сортировку, в которую можно было бы передать любой из этих массивов:

Если бы у меня были массивы, я бы написал:

C++ (Qt)
1
2
template <class T>
void QuickSort(T* elements, size_t size, bool (*cmpElements)(T*, T*));
И две функции:
C++ (Qt)
1
2
bool cmpPlayers(Player* player1, Player* player2);
bool cmpIndices(size_t* index1, size_t* index2);
Ну и вызывал бы:
C++ (Qt)
1
2
QuickSort(players, players.size(), cmpPlayers);
QuickSort(indices, indices.size(), cmpIndices);
Но для векторов этот код не работает. Я пробовал вот так:
C++ (Qt)
1
2
template <class T>
void QuickSort(typename std::vector<T>::iterator elements, size_t size, bool (*cmpElements)(typename std::vector<T>::iterator, typename std::vector<T>::iterator));
Но ничего не получилось: "не удается составить аргумент шаблон для "T""


1. Подскажите, пожалуйста,как нужно сделать.
2. Буду рад выслушать критику по интерфейсу (не те переменные передаю функцию, не так назвал, не так передаю и пр)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.11.2013, 00:13     Передать итератор на шаблонный вектор в функцию
Посмотрите здесь:

Как передать вектор из main() во внутреннюю функцию ? C++
C++ Функция, дружественная классу, вложенному в шаблонный класс, или как написать итератор.
C++ Как передать вектор в функцию?
итератор и вектор C++
C++ передать вектор объектов в дружественную функцию
Вектор и его итератор C++
C++ Вектор и итератор
C++ Как передать массив (двумерный/одномерный вектор) в функцию C++?

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4924 / 2667 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
03.11.2013, 05:02     Передать итератор на шаблонный вектор в функцию #2
Цитата Сообщение от R_e_n Посмотреть сообщение
1. Подскажите, пожалуйста,как нужно сделать.
передавать итераторы начала и конца

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
45
46
47
48
49
#include <iostream>
#include <vector>
 
template <typename T>
void swap(T& a, T& b)
{
    T c(a);
    a = b;
    b = c;
}
 
template <typename ForwardIterator>
void bubbleSort(ForwardIterator beg, ForwardIterator end)
{
    for (ForwardIterator it1 = beg; it1 != end; ++it1)
        for (ForwardIterator it2 = end-1; it2 != it1; --it2)
            if (*it2 < *(it2-1))
                swap(*(it2-1), *it2);
}
 
template <typename ForwardIterator, typename Compare>
void bubbleSort(ForwardIterator beg, ForwardIterator end, Compare comp)
{
    for (ForwardIterator it1 = beg; it1 != end; ++it1)
        for (ForwardIterator it2 = end-1; it2 != it1; --it2)
            if (comp(*it2, *(it2-1)))
                swap(*(it2-1), *it2);
}
 
template <typename T>
struct greater
{
    bool operator() (const T& x, const T& y) const {return y < x; }
};
 
int main()
{
    std::vector<int> v = {4, 3, 5, 2, 1};
    bubbleSort(v.begin(), v.end());
    for (auto &x: v) // C++11
        std::cout << x << " ";
    std::cout << std::endl;
 
    std::vector<double> v2 = {2.1, 5.2, 9.0, 1.1, 5.7};
    bubbleSort(v2.begin(), v2.end(), greater<double>());
    for (auto &x: v2) // C++11
        std::cout << x << " ";
    std::cout << std::endl;
}
R_e_n
0 / 0 / 0
Регистрация: 30.07.2012
Сообщений: 35
03.11.2013, 22:53  [ТС]     Передать итератор на шаблонный вектор в функцию #3
Спасибо огромное, помогло
Yandex
Объявления
03.11.2013, 22:53     Передать итератор на шаблонный вектор в функцию
Ответ Создать тему
Опции темы

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