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

STL - C++

Восстановить пароль Регистрация
 
rostykm
2 / 2 / 0
Регистрация: 30.03.2011
Сообщений: 34
18.04.2012, 21:07     STL #1
Добрый вечер всем кто открыл эту вкладку!
Надо реализовать кольцевой упорядоченный двозвязний список на STL + некоторые функции работы с ним (добавление нового, удаление, печать).

Я реализовал все кроме кильцевости. Где-то читал, что нельзя это сделать. Но уверен - выход есть. Помогите)))

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
#include "stdafx.h"
#include <iostream>
#include <algorithm>
#include <list>
#include <ctime>
 
using namespace std;
 
list<int> l;
list<int>::iterator it = l.begin();
list<int>::iterator ite = l.end();
bool flag = false;
 
void initialization()
{
    for (int i = 0; i < 10; i++)
        l.push_back(i);
}
 
void insert(int n)
{
    for (it=l.begin(); it!=l.end(); it++)
        if (*it > n)
        {
            l.insert(it, n);
            flag = true;
            break;
        }
    if (!flag)
        l.push_back(n);
}
 
void mydelete (int n)
{
    for (it=l.begin(); it != l.end(); it++)
        if (*it == n)
            it = l.erase(it);
}
 
void print()
{
    cout << "List ->";
    for (it=l.begin(); it!=l.end(); it++)
        cout << "  " << *it;
    cout << endl;
}
 
void size()
{
    cout << "Size ->  " << l.size() << endl;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    initialization();
    print();
    
    mydelete(4);
    print();
 
    insert(100);
    print();
 
    size();
    
    cout << "Time of working program - " << (double)clock()/CLOCKS_PER_SEC << " seconds " <<endl;
    system("pause");
    
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.04.2012, 21:07     STL
Посмотрите здесь:

C++ STL
C++ STL
C++ STL в С++
STL C++
C++ STL.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
19.04.2012, 10:00     STL #2
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
#include <iostream>
#include <list>
#include <iterator>
#include <algorithm>
 
namespace simple
{
 
template<class T>
class list
{
public:
   typedef typename std::list<T>::iterator iterator;
   typedef typename std::list<T>::const_iterator const_iterator;
 
   list():container()
   {
   }
   list(const std::initializer_list<T>& args):container(args)
   {
   }
   void insert(const T& value)
   {
      if (!container.empty())
      {
         auto up_bound = std::upper_bound(container.begin(), container.end(), value);
         if (up_bound != container.end())
         {
            container.insert(up_bound, value);
         }
         else
         {
            container.push_back(value);
         }
      }
      else
      {
         container.push_back(value);
      }
   }
   void erase(const T& value)
   {
      auto iter = std::find(container.begin(), container.end(), value);
      if (iter != container.end())
      {
         container.erase(iter);
      }
   }
   iterator begin() { return container.begin(); }
   iterator end() { return begin(); }
   const_iterator begin() const { return container.cbegin(); }
   const_iterator end() const { return begin(); }
private:
   template<class T2>
   friend std::ostream& operator << (std::ostream&, const list<T2>&);
   std::list<T> container;
};
 
template<class T>
std::ostream& operator << (std::ostream& os, const list<T>& lst)
{
   std::copy(lst.container.begin(), lst.container.end(), std::ostream_iterator<T>(os, "\n"));
   return os;
}
 
}
 
int main()
{
   simple::list<int> lst;
   lst.insert(10);
   lst.insert(9);
   lst.insert(8);
   lst.insert(20);
   lst.insert(5);
   std::cout << lst;
   lst.erase(8);
   lst.erase(5);
   std::cout << "after erase" << std::endl;
   std::cout << lst;
}
Кроме кольца. Насколько я понимаю для правильной закольцованности списка придется переопределять итераторы.

Добавлено через 56 секунд
http://liveworkspace.org/code/75084c...60eb36a16ebd75
rostykm
2 / 2 / 0
Регистрация: 30.03.2011
Сообщений: 34
19.04.2012, 14:50  [ТС]     STL #3
Цитата Сообщение от ForEveR Посмотреть сообщение
Кроме кольца.
Добавлено через 56 секунд
в этом весь прикол
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
19.04.2012, 15:24     STL #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
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#include <iostream>
#include <list>
#include <iterator>
#include <algorithm>
 
namespace simple
{
 
template<class T>
class list
{
private:
   template<class Container>
   class circle_iterator
   {
   public:
      circle_iterator(Container& cont, typename Container::iterator iter):
         cont_(cont), current(iter)
      {
      }
      circle_iterator& operator ++()
      {
         ++current;
         if (current == cont_.end())
         {
            current = cont_.begin();
         }
         return *this;
      }
      circle_iterator operator ++(int)
      {
         circle_iterator tmp(*this);
         this->operator ++();
         return tmp;
      }
      circle_iterator operator --()
      {
         if (current == cont_.begin())
         {
            std::advance(current, cont_.size() - 1);
         }
         else
         {
            --current;
         }
         return *this;
      }
      circle_iterator operator --(int)
      {
         circle_iterator tmp(*this);
         this->operator --();
         return tmp;
      }
      typename Container::value_type& operator *()
      {
         return *current;
      }
      typename Container::pointer operator ->()
      {
         return &(*current);
      }
   private:
      Container& cont_;
      typename Container::iterator current;
   };
public:
   typedef circle_iterator<std::list<T> > iterator;
   typedef iterator const_iterator;
 
   list():container()
   {
   }
   list(const std::initializer_list<T>& args):container(args)
   {
   }
   void insert(const T& value)
   {
      if (!container.empty())
      {
         auto up_bound = std::upper_bound(container.begin(), container.end(), value);
         if (up_bound != container.end())
         {
            container.insert(up_bound, value);
         }
         else
         {
            container.push_back(value);
         }
      }
      else
      {
         container.push_back(value);
      }
   }
   void erase(const T& value)
   {
      auto iter = std::find(container.begin(), container.end(), value);
      if (iter != container.end())
      {
         container.erase(iter);
      }
   }
   iterator begin() { return iterator(container, container.begin()); }
   //iterator end() { return iterator(container, container.end()); }
   //const_iterator begin() const { return container.cbegin(); }
   //const_iterator end() const { return begin(); }
private:
   template<class T2>
   friend std::ostream& operator << (std::ostream&, const list<T2>&);
   std::list<T> container;
};
 
template<class T>
std::ostream& operator << (std::ostream& os, const list<T>& lst)
{
   std::copy(lst.container.begin(), lst.container.end(), std::ostream_iterator<T>(os, "\n"));
   return os;
}
 
}
 
int main()
{
   simple::list<int> lst;
   lst.insert(10);
   lst.insert(9);
   lst.insert(8);
   lst.insert(20);
   lst.insert(5);
   std::cout << lst;
   lst.erase(8);
   lst.erase(5);
   std::cout << "after erase" << std::endl;
   std::cout << lst;
   int cnt = 10;
   int current = 0;
   std::cout << "List" << std::endl;
   for (simple::list<int>::iterator iter = lst.begin(); current != cnt; ++current, ++iter)
   {
      std::cout << *iter << std::endl;
   }
}
http://liveworkspace.org/code/9c91d4...e505f20410b10a

Остальное сам.
Yandex
Объявления
19.04.2012, 15:24     STL
Ответ Создать тему
Опции темы

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