Пример матрицы
От: Аноним  
Дата: 19.11.06 17:53
Оценка:
Нужно сделать матрицу внутри которой элементы храняться в векторе. Требуется только обращаться к элементам x(i,j)=X;
Y=x(i,j); Почему не работает код ниже и что в нем криво?

struct matrix {
   std::vector<MyStruct> v;
   int dim1, dim2;
   matrix(int _dim1 = 0, int _dim2 = 0): dim1(_dim1), dim2(_dim2) {
       v.reserve(dim1*dim2);
   }
   double & operator(int index1, int index2){
      return &v[index1*dim1+index2];
   }
   double operator(int index1, int index2) const{
      return v[index1*dim1+index2];
   }
};
Re: Лучше это поругайте
От: Аноним  
Дата: 19.11.06 18:16
Оценка:

struct matrix {
   std::vector<MyStruct> v;
   int dim1, dim2;
   matrix(int _dim1 = 0, int _dim2 = 0): dim1(_dim1), dim2(_dim2) {
       v.resize(dim1*dim2);
   }
   MyStruct & operator()(int index1, int index2){
      return v[index1*dim1+index2];
   }
   MyStruct operator()(int index1, int index2) const{
      return v[index1*dim1+index2];
   }
   std::vector<MyStruct>::const_iterator begin(){ return v.begin();}
   std::vector<MyStruct>::const_iterator end(){ return v.end(); }
};


Просто код очень ответственный и боюсь проглядеть что-нибуть
Re[2]: Лучше это поругайте
От: Иванков Дмитрий Россия  
Дата: 19.11.06 18:49
Оценка:
Здравствуйте, Аноним, Вы писали:

А>
A>      return v[index1*dim1+index2];
А>};


А>
Re[2]: Лучше это поругайте
От: Phoenickx  
Дата: 19.11.06 19:11
Оценка:
Здравствуйте, Аноним, Вы писали:

А>

А>struct matrix {
А>   std::vector<MyStruct> v;
А>   int dim1, dim2;
А>   matrix(int _dim1 = 0, int _dim2 = 0): dim1(_dim1), dim2(_dim2) {
А>       v.resize(dim1*dim2);
А>   }
А>   MyStruct & operator()(int index1, int index2){
А>      return v[index1*dim1+index2];
А>   }
А>   MyStruct operator()(int index1, int index2) const{
А>      return v[index1*dim1+index2];
А>   }
А>   std::vector<MyStruct>::const_iterator begin(){ return v.begin();}
А>   std::vector<MyStruct>::const_iterator end(){ return v.end(); }
А>};


А>


А>Просто код очень ответственный и боюсь проглядеть что-нибуть

Ответственный это как? По работе? И что от кода нужно: скорость или надежность?
С моей т.з. лучше бы сделать класс:

template<class T>
class matrix{
public:
    typedef std::vector<T> InnerData; //тут можно подумать об std::vector<std::vector<T> >
private:
    InnerData v;
public:
    matrix(int _dim1 = 0, int _dim2 = 0) : dim1(_dim1), dim2(_dim2), v(_dim1*_dim2) //или v(RowType(v)), где
                                                                                    //RowType это std::vector<T>
    {}
};

Также неуверен в необходимости использования второго оператора функции, я не знаю есть ли какие-то преимущества от его использования, т.к. первую версию можно использовать и в правой и в левой части.
Методы begin() и end() лучше бы убрать, а добавить методы
SizeX(){return dim1;} 
SizeY(){return dim2;}
Re: Пример матрицы
От: Starik_Hottabych  
Дата: 19.11.06 20:30
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Нужно сделать матрицу внутри которой элементы храняться в векторе. Требуется только обращаться к элементам x(i,j)=X;

А>Y=x(i,j); Почему не работает код ниже и что в нем криво?

А>
А>struct matrix {
А>   std::vector<MyStruct> v;
А>   int dim1, dim2;
А>   matrix(int _dim1 = 0, int _dim2 = 0): dim1(_dim1), dim2(_dim2) {
А>       v.reserve(dim1*dim2);
А>   }
А>   double & operator(int index1, int index2){
А>      return &v[index1*dim1+index2];
А>   }
А>   double operator(int index1, int index2) const{
А>      return v[index1*dim1+index2];
А>   }
А>};
А>


Где указан какой оператор перегружаете?
Правильно
<return value> operator<operator>(argument list)

В вашем случае Вы упустили <operator>, например = или () или какой-то еще который Вы перегружаете.Судя по всему Вы перегружаете оператор ()
слудовательно Вам надо было писать следующее
double operator()(int,int)


Еще одно замечание: когда идет передача по ссылке то использовать оператор изъятия адреса не нужно.
Вы пишете:
double & operator()(int index1,int index2){
return &v[index1*dim1+index2];
}

а надо
double &operator()(int index1,int index2){
return v[index1*dim1+index2];
}


Вдобавок не понятно зачем использовать в данном случае структуру а не класс, и в данном вопросе я солидарен с Phoenickx.
Re: Пример матрицы
От: Андрей Тарасевич Беларусь  
Дата: 19.11.06 21:23
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Нужно сделать матрицу внутри которой элементы храняться в векторе. Требуется только обращаться к элементам x(i,j)=X;

А>Y=x(i,j); Почему не работает код ниже и что в нем криво?

А>
А>struct matrix {
А>   std::vector<MyStruct> v;
А>   int dim1, dim2;
А>   matrix(int _dim1 = 0, int _dim2 = 0): dim1(_dim1), dim2(_dim2) {
А>       v.reserve(dim1*dim2);
А>   }
А>   double & operator(int index1, int index2){
А>      return &v[index1*dim1+index2];
А>   }
А>   double operator(int index1, int index2) const{
А>      return v[index1*dim1+index2];
А>   }
А>};
А>


В приведенном коде нечему "работать" или "не работать". Тут присутствует только определение класса. Которое, к тому же, не еще и компилируется. Приведи реальный код, который, жедательно, еще и демонстрировал, что именно "не работатет".

Хотя сразу стоит заметить, что если 'dim1' и 'dim2' — размеры, индексируемые именно 'index1' и 'index2' соответственно, то при вычислении линейного индекса 'index1' надо умножать на 'dim2', а не на 'dim1', как у тебя. Т.е. index = index1 * dim2 + index2.
Best regards,
Андрей Тарасевич
Re: Пример матрицы
От: johny5 Новая Зеландия
Дата: 28.11.06 09:43
Оценка:
А>
А>       v.resize(dim1*dim2);
А>
Re[2]: Лучше это поругайте
От: Аноним  
Дата: 28.11.06 11:48
Оценка:
Здравствуйте, Аноним, Вы писали:

А>

А>struct matrix {
А>   std::vector<MyStruct> v;
А>   int dim1, dim2;
А>   matrix(int _dim1 = 0, int _dim2 = 0): dim1(_dim1), dim2(_dim2) {
А>       v.resize(dim1*dim2);
А>   }
А>   MyStruct & operator()(int index1, int index2){
А>      return v[index1*dim1+index2];
А>   }
А>   MyStruct operator()(int index1, int index2) const{
А>      return v[index1*dim1+index2];
А>   }
А>   std::vector<MyStruct>::const_iterator begin(){ return v.begin();}
А>   std::vector<MyStruct>::const_iterator end(){ return v.end(); }
А>};


А>


А>Просто код очень ответственный и боюсь проглядеть что-нибуть

поставить проверку index1 < dim1 && index2 < dim2. И может лучше сделать unsigned?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.