Нужно сделать матрицу внутри которой элементы храняться в векторе. Требуется только обращаться к элементам 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];
}
};
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(); }
};
Просто код очень ответственный и боюсь проглядеть что-нибуть
Здравствуйте, Аноним, Вы писали:
А>A> return v[index1*dim1+index2];
А>};
А>
Здравствуйте, Аноним, Вы писали:
А>
А>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;}
Здравствуйте, Аноним, Вы писали:
А>Нужно сделать матрицу внутри которой элементы храняться в векторе. Требуется только обращаться к элементам 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.
Здравствуйте, Аноним, Вы писали:
А>Нужно сделать матрицу внутри которой элементы храняться в векторе. Требуется только обращаться к элементам 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.
А>А> v.resize(dim1*dim2);
А>
Здравствуйте, Аноним, Вы писали:
А>
А>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?