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

Checked_iter - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Быстродействие http://www.cyberforum.ru/cpp-beginners/thread928426.html
Что лучше использовать, если быстродействие системы достаточно важно, а элемент используется часто? template <typename T> struct Point { T x, y; }; template <typename T>
C++ Не работает openmp Написал простенькую программку с распараллеливанием собрал откомпилил, но распараллеливания нет. Программка выглядит так: -------------------------------- #include <iostream> #include <omp.h>... http://www.cyberforum.ru/cpp-beginners/thread928416.html
C++ Каким образом getchar() меняет содержимое массива?
Здравствуйте! Почему-то наличие getchar(); в коде влияет на содержимое массива. Если данный код не менять - то выводит правильный результат. Результат представлен на первом скрине. Если удалить...
C++ клас myDate
Создайте класс Date, который будет содержать информацию о дате (день, месяц, год). С помощью механизма перегрузки операторов, определите операцию разности двух дат (результат в виде количества дней...
C++ Не могу побороть wxDevC++ - на Hello world "Проект не откомпилирован" http://www.cyberforum.ru/cpp-beginners/thread928353.html
Хотел попробовать wxDevC++ в деле. Установил. Само собой, для начала сделал Hello, world. И вдруг выскакивает окно "Проект не откомпилирован"... и никак не поборю это дело. Текст-то классический:...
C++ Определить какое число Данная последовательность: 19, 39, 59, 79, 99, 119 ... И нужно определить, если введенное число относится к этой последовательности. Возможно ли это сделать вписав только одно условие? подробнее

Показать сообщение отдельно
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
26.07.2013, 13:15
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
#include <vector>
#include <iostream>
#include <exception>
#include <stdexcept>
 
template<typename Container, typename Iterator = typename Container::iterator>
class checked_iterator
{
public:
   checked_iterator(Container& cnt, Iterator pos) :
      container_(&cnt), position_(pos)
   {
   }
   checked_iterator(const checked_iterator& rhs) :
      container_(&rhs.container_), position_(rhs.position_)
   {
   }
   checked_iterator& operator ++()
   {
      check_valid();
      ++position_;
      return *this;
   }
   checked_iterator operator ++ (int)
   {
      checked_iterator tmp(*this);
      this->operator ++();
      return tmp;
   }
   typename Container::const_reference operator * () const
   {
      return const_cast<typename Container::reference>
      (const_cast<checked_iterator&>(*this).operator *());
   }
   typename Container::reference operator * ()
   {
      check_valid();
      return *position_;
   }
   friend bool operator == (const checked_iterator& first, const checked_iterator& second)
   {
      return first.container_ == second.container_ && first.position_ == second.position_;
   }
   friend bool operator != (const checked_iterator& first, const checked_iterator& second)
   {
      return !(first == second);
   }
private:
   void check_valid() const
   {
      for (typename Container::const_iterator pos = container_->begin(); pos != container_->end(); ++pos)
      {
         if (pos == position_)
         {
            return;
         }
      }
      throw std::out_of_range("invariant failed");
   }
 
   Container* container_;
   Iterator position_;
};
 
int main()
{
   std::vector<int> vec = {1,2,3,4};
   checked_iterator<std::vector<int> > c_begin(vec, vec.begin()), c_end(vec, vec.end());
   for (; c_begin != c_end; ++c_begin)
   {
      std::cout << *c_begin << std::endl;
   }
   checked_iterator<std::vector<int> > next_c_begin(vec, vec.begin());
   vec.resize(100);
   try
   {
      for (; next_c_begin != c_end; ++next_c_begin)
      {
         std::cout << *next_c_begin << std::endl;
      }
   }
   catch (const std::exception& e)
   {
      std::cout << e.what() << std::endl;
   }
}
Bash
1
2
3
4
5
6
./new
1
2
3
4
invariant failed
Если проверка на равенство не работает - значит используется debug режим, в котором свои checked итераторы. Итераторы нельзя выводить в поток. Можно вывести либо адрес итератора, либо адрес элемента на который указывает итератор (совсем не факт, что сработает, если итератор инвалидировался). Можно сделать еще один вариант, сохранять после каждой операции размер контейнера/адрес буфера, и в check_valid просто проверять, что они до сих пор совпадают.
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru