Форум программистов, компьютерный форум 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> int main(int argc, char* argv) { #pragma omp parallel num_threads(4) http://www.cyberforum.ru/cpp-beginners/thread928416.html
C++ Каким образом getchar() меняет содержимое массива?
Здравствуйте! Почему-то наличие getchar(); в коде влияет на содержимое массива. Если данный код не менять - то выводит правильный результат. Результат представлен на первом скрине. Если удалить первый getchar() с 21 строки, то в результате появляется абракадабра - представлено на втором скрине. Если удалить второй getchar(), то в результате вообще получаются нули - представлено на третьем...
C++ клас myDate
Создайте класс Date, который будет содержать информацию о дате (день, месяц, год). С помощью механизма перегрузки операторов, определите операцию разности двух дат (результат в виде количества дней между датами), а также операцию увеличения даты на определенное количество дней. с++ class myDate { public: myDate(); ~myDate(); private:
C++ Не могу побороть wxDevC++ - на Hello world "Проект не откомпилирован" http://www.cyberforum.ru/cpp-beginners/thread928353.html
Хотел попробовать wxDevC++ в деле. Установил. Само собой, для начала сделал Hello, world. И вдруг выскакивает окно "Проект не откомпилирован"... и никак не поборю это дело. Текст-то классический: #include <windows.h> #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv) { printf("Hello World!\n");
C++ Определить какое число Данная последовательность: 19, 39, 59, 79, 99, 119 ... И нужно определить, если введенное число относится к этой последовательности. Возможно ли это сделать вписав только одно условие? подробнее

Показать сообщение отдельно
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7955 / 4717 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
26.07.2013, 13:15     Checked_iter
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 просто проверять, что они до сих пор совпадают.
 
Текущее время: 16:41. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru