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

Реализация механизма обращения к двумерному массиву - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Вычисление функции на заданном промежутке http://www.cyberforum.ru/cpp-beginners/thread1223411.html
написать программу вычисления функции на заданном промежутке с шагом 0.2 и построить график этой функции
C++ Каким образом после чтения из файла, узнать позицию для чтения следующего куска байт Здравствуйте, задача такова есть файл, размером 1000 байт, нужно открыть его считать 100 байт, после чтения закрыть. Потом опять открыть и считать уже другие 100 байт с другой позиции и т.д пока не дойдем до конца файла. Я так понимаю что бы узнать с какой позиции читать нужно 1000 : 100 = 10, получается 10 позиций правильно ли я предполагаю? Каким образом после чтения из файла, узнать позицию... http://www.cyberforum.ru/cpp-beginners/thread1223398.html
Что за пустые шаблоны template <> struct/inline? C++
что за пустые шаблоны template <> за которыми следуют class/struct/inline? По многочисленным источникам в c++ шаблоны имеют вид, цитата с википедии: Шаблон функции начинается с ключевого слова template, за которым в угловых скобках следует список параметров. Затем следует объявление функции: template< typename T > void sort( T array, int size ); // прототип: шаблон sort объявлен, но...
C++ Игра "Жизнь"; Нужно, чтобы первое поколение задавалось оператором (с клавиатуры)
Нужна помощь с решением задачи "Жизнь" на с++ Есть код программы, которая задает первое поколение колонии случайным образом. Но мне нужно, чтобы первое поколение задавалось оператором(с клавиатуры). Пробовал ввести массив в начало задачи, дает ввести только первое значение массива. Очень нужна помощь. Вот текст задачи: // ConsoleApplicationIgra.cpp: определяет точку входа для...
C++ Проверка на ввод http://www.cyberforum.ru/cpp-beginners/thread1223345.html
Есть переменная целочисельная ввожу ее с клавиатуры , но когда ввожу букву нажимаю enter вываливает ексепшын. Нашел функцию isdigit , попытался сделать так one: cout<<"Enter X_start:"<<endl; cin>>X_start; if(isdigit(X_start)==false){ goto one;} Но оно не отлавливает , возможно это можно сделать с помощью try catch?
C++ Объединение функций, которые выводят внешне вершины дерева Здравствуйте. Вот у меня есть 2 функции, которые выводит внешне вершины дерева, (одна правые, другая левые). void Tree::Vnesnie_versini_r(TreeNode *v, int level) { if (v!=NULL) { Vnesnie_versini_r(v->right, level+1); IndentBlanks(6*level); cout << v->data << endl; } } подробнее

Показать сообщение отдельно
gray_fox
What a waste!
 Аватар для gray_fox
1246 / 1129 / 54
Регистрация: 21.04.2012
Сообщений: 2,354
Завершенные тесты: 3
06.07.2014, 20:14     Реализация механизма обращения к двумерному массиву
Цитата Сообщение от iRomul Посмотреть сообщение
Можно ли реализовать такие перегрузки оператора []?
Можно ввести промежуточный объект, который будет возвращаться operator [], который будет также иметь operator [] и operator =, но проще реализовать индексацию с помощью operator ().

Добавлено через 1 час 57 минут
Вот пример, возможно не всё корректно, то суть должна быть понятна:
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <functional>
#include <algorithm>
#include <utility>
#include <memory>
#include <cstddef>
#include <cassert>
 
 
template<typename T>
struct matrix {
 
   template<typename V>
   struct index_proxy {
    
      V & operator [](std::size_t const j) const {
         assert(index < ref.height());
         assert(j < ref.width());
         
         return ref.data()[ref.width() * index + j];
      }
      
      operator V &() const {
        assert(index < ref.size());
        
        return ref.data()[index];
      }
      
      template<typename S>
      void operator =(S && value) {
         assert(index < ref.size());
         
         ref.data()[index] = std::forward<S>(value);
      }
    
   private:
      friend class matrix;
   
      index_proxy(matrix & ref, std::size_t const index) : ref(ref), index(index) {}
      
      index_proxy(index_proxy const&) = delete;
      index_proxy(index_proxy &&) = delete;
  
      matrix &          ref;
      std::size_t const index;
   };
   
   
   matrix(std::size_t const height_, std::size_t const width_)
       : data_(new T[height_ * width_])
       , height_(height_)
       , width_(width_)
       {}
   
   matrix(matrix const& other) : matrix(other.height(), other.width()) {
      std::copy_n(other.data(), size(), data());
   }
   
   matrix(matrix && other)
       : data_(std::move(other.data_))
       , height_(other.height_)
       , width_(other.width_)
       {}
       
  matrix & operator =(matrix const& other) {
      height_ = other.height();
      width_  = other.width();
      
      if (size() != other.size()) {
         data().reset(new T[height() * width()]);
      }
      
      std::copy_n(other.data(), size(), data());
      
      return *this;
   }
   
    matrix & operator =(matrix && other) {
      data_   = std::move(other.data_);
      height_ = other.height_;
      width_  = other.width_;
      
      return *this;
   }
   
   
   index_proxy<T> operator [](std::size_t const index) {
      return {*this, index};
   }
   index_proxy<T const> operator [](std::size_t const index) const {
      return {*this, index};
   }
   
   
   std::size_t height() const {
      return height_;
   }
   
   std::size_t width() const {
      return width_;
   }
   
   std::size_t size() const {
      return height() * width();
   }
   
   T * data() {
      return data_.get();
   }
   T const* data() const {
      return data_.get();
   }
   
   
private:
   std::unique_ptr<T[]> data_;
   std::size_t          height_;
   std::size_t          width_;
};
 
 
int main() {
   matrix<int> m(3, 4);
   
   for (std::size_t i = 0; i != m.size(); ++i) {
      m[i] = static_cast<int>(i);
   }
   
   for (std::size_t i = 0; i != m.size(); ++i) {
      std::cout << m[i] << ' ';
   }
   std::cout << std::endl;
   
   for (std::size_t i = 0; i != m.height(); ++i) {
      for (std::size_t j = 0; j != m.width(); ++j) {
         std::cout << m[i][j] << ' ';
      }
      std::cout << std::endl;
   }
}
http://ideone.com/LxIDrE
 
Текущее время: 20:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru