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

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

Войти
Регистрация
Восстановить пароль
 
R_e_n
0 / 0 / 0
Регистрация: 30.07.2012
Сообщений: 35
#1

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

03.11.2013, 00:13. Просмотров 1017. Ответов 2
Метки нет (Все метки)

Здравствуйте.

Есть два вектора
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. Буду рад выслушать критику по интерфейсу (не те переменные передаю функцию, не так назвал, не так передаю и пр)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.11.2013, 00:13
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Передать итератор на шаблонный вектор в функцию (C++):

Как передать вектор в функцию? - C++
Какими способами можно передать вектор в функцию? Например есть функция void asd() { for(vector&lt;Temp&gt;::iterator i = temp.begin();...

Передать в функцию указатель на вектор - C++
У меня есть вектор. Большой. Можно ли передать его так в ф-цию что бы не создавалась копия и что бы все методы работали (например...

Передать вектор объектов в дружественную функцию - C++
Я думаю передать вот так, но почему-то синтаксическая ошибка. filtr_tup(vector&lt;OC&gt;); #ifndef OC_H #define OC_H #include...

Функция, дружественная классу, вложенному в шаблонный класс, или как написать итератор. - C++
Здравствуйте! Пишу аналог STL vector. Возникают следующие ошибки: source.cpp:11: error: expected initializer before ‘operator’ ...

Как передать вектор из main() во внутреннюю функцию ? - C++
Нужно передать вектор из main в функцию gen_binar_sq , записать в него элементы, и получить в main заполненый вектор и распечатать...

Как передать массив (двумерный/одномерный вектор) в функцию? - C++
#include &lt;iostream&gt; #include &lt;ctime&gt; using namespace std; int n,m;//סענמך ט סעמכבצנג void searchmin(int g,int mm,int i,int...

2
MrGluck
Модератор
Эксперт CЭксперт С++
7498 / 4614 / 694
Регистрация: 29.11.2010
Сообщений: 12,634
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;
}
1
R_e_n
0 / 0 / 0
Регистрация: 30.07.2012
Сообщений: 35
03.11.2013, 22:53  [ТС] #3
Спасибо огромное, помогло
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.11.2013, 22:53
Привет! Вот еще темы с ответами:

Вектор и итератор - C++
Почему где не смотрел всегда содержимое вектора смотрят через итераторы)) Решил попробывать как всегда стандартным проежженым способом. ...

Вектор и итератор с++ - C++
//////////////////// /////////// Задание: Элементы вектора D случайным образом перемешаны. Элементы ki вектора K /////////// указывают...

Вектор и его итератор - C++
На сколько мне известно,векторы выполняют вставку и удаление в X позицию контейнера на которую указывает его итератор: т.е. метод вставки...

Можно ли передать в функцию либо вектор, либо список, если да, то как? - C++
Можно ли передать в функцию либо вектор, либо список, если да, то как?


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

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

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