Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,701

Как отсортирвоать контейнер, если его тип определяется по ходу выполнения программы? (динамическая идентификация типов)

20.12.2011, 12:07. Показов 1002. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
собсно
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 <windows.h>
#include <stdio.h>
#include <vector>
#include <list>
#include <algorithm>
#include <cxxabi.h>
using namespace std;
 
 
//Это шаблонная функция
template <class T>
void f () {
 T rez;
 
 //Положим что-нибудь в контейнер
 rez.push_back (1);
 rez.push_back (2);
 
 //Здесь я определяю узнаю имя контейнера, который у меня используется
 char* realname= abi::__cxa_demangle(typeid(rez).name(), 0, 0, NULL);
 *strpbrk(realname,"<")= 0; realname+= 5;
 
 //Вот тут это имя можно даже посмотреть
 printf ("realname==%s \n", realname);
 
 //А тут мы сортируем контейнер разными способами в зависимости от того
 // какой у контейнера тип
 if (!(strcmp (realname, "list")))  
  rez.sort();
 
 
 //Если у контейнера будет тип "list" то компилится, если только этот
 //блок заблокирован, непонятно почему, ведь он будет выполняться 
 //только в том, случае, если тип контейнера как раз не list!
 
 //else 
  //sort(rez.begin(), rez.end());
 
}
 
int main () {
 SetConsoleCP (1251);
 SetConsoleOutputCP (1251);
 
 f< list<int> > ();
 
 getchar ();
 return 0;
}
Сложность сопряжена с тем, напомню, что списки сортируются с помощью функции-метода sort, в отличие от векторов или двусторонних очередей.
Спасибо, кто откликнется
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.12.2011, 12:07
Ответы с готовыми решениями:

как устроена динамическая идентификация типов
Здрасте! Меня интересует, как компилируемая программа может проводить RTTI , если во время компиляции типы данных еще не известны.

Как производить смену окон по ходу выполнения программы
Такой вопросик, как сделать так, чтобы в зависимости от действий пользователя ( нажимание на кнопки ) окно менялось. Т,е. менялись виджеты...

Как поменять цвет текста кнопки по ходу выполнения программы?
Игра пятнашки, требуется поменять цвет кнопки под цифрой 15 на красный, но, так как, кнопки не двигаются, а просто меняются текстом, то...

4
184 / 24 / 4
Регистрация: 18.01.2011
Сообщений: 359
20.12.2011, 12:28
нет ну как...если типы по умолчанию известны...строки там цифры еще что...то можно ведь перегружать ф-и например с помощью operator - подставлять под нужный тип.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
20.12.2011, 12:30
kravam, Можно написать функцию, которая в зависимости от переданного типа будет сортировать.
Т.е.

C++
1
2
3
4
5
6
7
8
9
10
11
template<class Container>
void sort(Container& cont)
{
    std::sort(cont.begin(), cont.end());
}
 
template<class T>
void sort(std::list<T>& lst)
{
    lst.sort();
}
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,701
20.12.2011, 13:07  [ТС]
ForEveR,а тогда возникает два вопроса, вот твой код:
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
#include <windows.h>
#include <stdio.h>
#include <vector>
#include <list>
#include <algorithm>
#include <cxxabi.h>
using namespace std;
 
 
template<class Container>
void sort_(Container& cont)
{
    std::sort(cont.begin(), cont.end());
}
 
 
template<class t>
void sort_(std::list<t>& lst)
{
    printf ("ddddddddddd\n");
    lst.sort();
}
 
 
 
int main () {
 SetConsoleCP (1251);
 SetConsoleOutputCP (1251);
 
 list <int> rez;
 rez.push_back (1);
 rez.push_back (2);
 
 sort_ (rez); 
 
 getchar ();
 return 0;
}
Почему компилятор подстьавляет именно нужную функцию, вторую то есть? Да, согласен, тип передаваемого параметра list <int> , а тип этой функции std::list<t> и они красиво друг другу подходят. Но у первой функции её параметр Container тоже запросто может быть типом list <int>! Тем не мене компилятор не путается, а подставляет именно вторую функцию, почему так?
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
20.12.2011, 13:23
kravam, Читай про специализацию шаблонов. Выбирается та функция, которая наиболее подходит.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.12.2011, 13:23
Помогаю со студенческими работами здесь

Динамический массив в С++: как поменять длину массива по ходу выполнения программы?
Есть такая проблема: есть файл, в котором построчно записаны числа float (1 число - 1 строка). Количество чисел неизвестно. Как...

Изменение содержания ресурсов по ходу выполнения программы
Собственно вопрос, могу ли я открыть файл из ресурсов на изменение? Например мне нужно изменить содержимое файла *.txt. Открываю его...

Можно ли добавлять элементы в перечисление по ходу выполнения программы?
Можно ли добавлять элементы в перечисление по ходу выполнения программы?

Архитектура программы: как лучше реализовать контейнер и методы управления его содержимым?
Доброго времени суток. Имею такой код: class A { private: ... // поля класса int foo_1(); void foo_2();

Как узнать тип шаблонного класса во время выполнения программы?
Тоесть: имеем класс list&lt;int&gt; или list&lt;double&gt;, и как узнать какой это тип? Ну int или double?


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru