Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
840 / 478 / 58
Регистрация: 18.09.2012
Сообщений: 1,688
1

Список С++

26.07.2013, 11:49. Показов 1846. Ответов 23
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток всем. Возник вопрос, как его решить не знаю. Те кто знаком c python знают, что там есть такая штука как "list". В нем можно хранить объекты любых типов. Вставл вопрос, а как такое на С++ реализуется а еще лучше, возможно ли?
C++
1
2
3
4
5
6
7
8
9
template<typename T>
class List
{
private:
    T data;
    List<T>* next;
public:
    //и дальше по тексту
}
Такая штука не прокатит, ведь следующий элемент должен иметь тип, что и предыдущий. Бредовая идея создать класс Object и пойти от него наследовать, все остальные типы, но блин, а int? char? а уже написаниые классы и функции?
Может кто-нибудь мучался таким?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.07.2013, 11:49
Ответы с готовыми решениями:

Создать список L3 из элементов, входящих и в список L1 и в список L2
создать список л3 из элементов входящих и в список л1 и в список л2

Имеется список женихов и список невест. Объединить эти списки в список пар с учетом требований партнерам
Имеется список женихов и список невест. Каждая запись списка содержит пол, имя, возраст, рост, вес,...

программа которая берет список и создает список другой из этого же списка + тот же список без последнего элемента
надо написать программу которая берет список и создает список другой из этого же списка + тот же...

Составить программу, которая формирует список L, включив в него по одному разу элементы, которые входят в список L1 но не входят в список L2
Составить программу, которая формирует список L, включив в него по одному разу элементы, которые...

23
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
26.07.2013, 12:14 2
C++
1
std::list < boost::any > mylist;
1
840 / 478 / 58
Регистрация: 18.09.2012
Сообщений: 1,688
26.07.2013, 12:21  [ТС] 3
Croessmah, а самому ручками реализовать подобное как?
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
26.07.2013, 12:24 4
Цитата Сообщение от Wolkodav Посмотреть сообщение
а самому ручками реализовать подобное как?
boost - открытая библиотека. Загляни в исходники.
1
840 / 478 / 58
Регистрация: 18.09.2012
Сообщений: 1,688
26.07.2013, 12:25  [ТС] 5
Ок, спасибо.
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
26.07.2013, 12:30 6
Лучший ответ Сообщение было отмечено как решение

Решение

Вот оно кстати. Непросто, но разобраться можно.
3
840 / 478 / 58
Регистрация: 18.09.2012
Сообщений: 1,688
26.07.2013, 12:33  [ТС] 7
Ой блин... Давно не читал такие коды на С++...
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
26.07.2013, 16:30 8
Мне внезапно стало интересно.., а как ты их оттуда доставать будешь?
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
26.07.2013, 16:32 9
Цитата Сообщение от castaway Посмотреть сообщение
а как ты их оттуда доставать будешь?
http://www.boost.org/doc/libs/... y/s02.html
1
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
26.07.2013, 16:35 10
Ну тогда такой контейнер актуален только для простых типов.
Кстати, кто-нибудь может привести жизненный пример, когда это может пригодиться?
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
26.07.2013, 16:39 11
castaway, Тысячи их. Парсинг джсона, хмл, доставание информации из БД и так далее. Либо void*, либо any (или нечто подобное).
1
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
26.07.2013, 16:48 12
На словах и я могу три способа придумать) Где непосредственно это используется?
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
26.07.2013, 16:55 13
castaway, void*? Ну, например можно посмотреть soci. any в том или ином виде? http://pocoproject.org/docs/
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
26.07.2013, 16:58 14
void * - это понятно, но ведь надо же и информацию о типе держать.
Создать контейнер, в который можно пихать все что угодно - не проблема. Проблема в том как оттуда это доставать.
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
26.07.2013, 16:59 15
castaway, В any информация держится. Жаль, что через typeinfo, но впринципе этого иногда достаточно.
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
26.07.2013, 17:01 16
Цитата Сообщение от ForEveR Посмотреть сообщение
Жаль, что через typeinfo
А есть идеи через что еще можно держать помимо typeinfo ?
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
26.07.2013, 17:03 17
castaway, Для всеобщего использования? typeinfo наилучший вариант или же некую идентификацию типа (ну например значение enum-а или константы для всех basic типов), но это кривоватый вариант. Когда работаем через void* как мы опознаем, что значение именно данного типа? Вот так же и с any.
0
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
26.07.2013, 17:18 18
Цитата Сообщение от Wolkodav Посмотреть сообщение
Croessmah, а самому ручками реализовать подобное как?
как простенький вариант:
Кликните здесь для просмотра всего текста
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include <exception>
 
 
struct any_list_bad_cast : std::exception {
 
   virtual char const* what() const noexcept override {
      return "any_list bad cast";
   }
};
 
class any_list {
 
   struct node_base {
      
      node_base() noexcept : prev(this), next(this) {}
 
      void insert_before(node_base * node) noexcept {
         prev->next = node;
         node->prev = prev;
 
         this->prev = node;
         node->next = this;
      }
 
      void insert_after(node_base * node) noexcept {
         next->prev = node;
         node->next = next;
 
         this->next = node;
         node->prev = this;
      }
 
      void erase() noexcept {
         prev->next = next;
         next->prev = prev;
         delete this;
      }
 
      virtual ~node_base() {}
 
      node_base * prev;
      node_base * next;
   };
 
   template<typename T>
   struct holder_node : node_base {
    
      explicit holder_node(T const& value) : value(value) {}
 
      T value;
   };
 
   template<typename T>
   T & cast_or_throw(node_base * node) const {
      if (auto const p = dynamic_cast<holder_node<T> *>(node)) {
         return p->value;
      }
      throw any_list_bad_cast();
   }
 
 
public:
   template<typename T>
   void push_front(T const& value) {
      head.insert_after(new holder_node<T>(value));
   }
 
   template<typename T>
   void push_back(T const& value) {
      head.insert_before(new holder_node<T>(value));
   }
 
   void pop_front() {
      head.next->erase();
   }
 
   void pop_back() {
      head.prev->erase();
   }
 
   template<typename T>
   T & front() {
      return cast_or_throw<T>(head.next);
   }
 
   template<typename T>
   T const& front() const {
      return cast_or_throw<T>(head.next);
   }
 
   template<typename T>
   T & back() {
      return cast_or_throw<T>(head.prev);
   }
 
   template<typename T>
   T const& back() const {
      return cast_or_throw<T>(head.prev);
   }
 
   bool empty() const noexcept {
      return (&head == head.next);
   }
 
   ~any_list() {
       while (!empty()) {
          pop_front();
       }
   }
 
private:
   node_base head;
};
1
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
26.07.2013, 18:09 19
Приходит на ум что-то вроде:
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
#include <typeinfo>
#include <iostream>
#include <stdexcept>
 
class any {
    void *  m_p;
 
public:
 
    template <class T> any( T value ) : m_p( (void *)(new T ( value )) ) {}
 
    template <class T> operator T () {
        T value;
        switch ( typeid( T ).name()[0] ) {
            case 'c':
                value = *((char *)m_p);
                break;
 
            case 'i':
                value = *((int *)m_p);
                break;
 
            default:
                throw std::domain_error( "bad cast\n" );
        }
        return value;
    }
};
 
int main()
{
    any c = 'c';
    any i = 1234567890;
 
    std::cout << (char)c << std::endl;
    std::cout << (int)i << std::endl;
}
Возможно подошел немного не с той стороны... но как вариант вполне сойдет.

Добавлено через 5 минут
gray_fox, с ходу и не сообразишь... как этим воспользоваться?
0
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
26.07.2013, 18:18 20
Цитата Сообщение от castaway Посмотреть сообщение
gray_fox, с ходу и не сообразишь... как этим воспользоваться?
Так же как и any, надо знать, какой тип где лежит
C++
1
2
3
any_list list;
list.push_back(1);
auto back = list.back<int>();
в таком духе

Добавлено через 4 минуты
Правда как обходить такую коллекцию не особо понятно)
1
26.07.2013, 18:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.07.2013, 18:18
Помогаю со студенческими работами здесь

Создать список L, включив в него по одному разу элементы, которые входят в список L1, но не входят в список L2
Описать процедуру, которая формирует список L, включив в него по одному разу элементы, которые ...

Составить базу данных об учащихся. Составить программу позволяющую выводить полный список учащихся, список выбравших предмет, список лучших учеников
Составить базу данных об учащихся, предусмотрев поля: Ф.И.О., предметы по выбору, экзаменационные...

Разделить исходный список на два списка: список чисел из диапазона [a,b] и список чисел не из заданного диапазона
Создайте приложение, которое разделит исходный список из вещественных чисел на два списка: список...

Создать список L3 из элементов, которые входят в список L1 и не входят в список L2
Задание : Создать список L3 из элементов, которые входят в список L1 и не входят в список L2,...

Создать список L3 из элементов, которые входят в список L1 и не входят в список L2
Нужно создать список L3 из элементов, которые входят в список L1 и не входят в список L2, вернуть...

3 класса: список, стек(как список), очередь(как список)
препод дал задание: написать 3 класса (список, стек, очередь), методы: вывод, добавление,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru