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

Класс Vector - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
Alexex
0 / 0 / 0
Регистрация: 22.12.2011
Сообщений: 23
14.05.2012, 00:58     Класс Vector #1
Помогите молю. Нужно реализовать класс вектор как класс шаблон. Перегрузить операторы ввода-
вывода, сложение (сумма векторов), умножение (векторное произведение),
индексирование (доступ к компонентам вектора).

Добавлено через 1 час 32 минуты
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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <conio.h>
using namespace std;
 
 
 
template <class T> class Vector
{
  T *data;  // Начало одномерного массива.
  int size,n; // Количество элементов в массиве
 public:
  Vector(int); // Конструктор класса vector.
  ~Vector() { delete[] data; } // Деструктор.
  // пропишем методы
 int Size(){
return size;
}
  // Расширение действия (перегрузка) операции "[]":
  T& operator[] (int i) { return data[i]; }
  void Run();
  
  /*template<class T> Vector<T> operator+( Vector<T> const & l, Vector<T> const & r )
{
    if(l.Size() != r.Size())
        throw("operator+: incompatible dimensions.");
    Vector<T> ret(l.Size(), T(0));
    for(size_t i = 0; i < l.Size(); i++)
        ret(i) = l(i) + r(i);
    return ret;
};*/
 
 
 /* template <class T> Vector<T> operator =(const Vector<T> & other){
                
               
        if (this != &other) // защита от неправильного самоприсваивания
        {
            // 1: выделяем "новую" память и копируем элементы
            Vector<T> * new_array = new Vector<T>[other.n];
            std::copy(other.data, other.data + other.n, new_array);
 
            // 2: освобождаем "старую" память
            delete [] data;
 
            // 3: присваиваем значения в "новой" памяти объекту
            data = new_array;
            size = other.n;
        }
        // по соглашению всегда возвращаем *this
        return *this;
    }
   */     
 
 
 
 
 template <class T> Vector<T> operator+( Vector<T> &A){
     Vector <T> B(A.Size());
      for(int i=0;i<size;i++){ B[i]=data[i]+A[i];}
      return B;
  }
};
 
 
//template <class T> Vector<T> Vector<T>::operator+(Vector<T> A){
 
         
//}
 
 
// Внешнее определение конструктора класса:
template <class T> Vector <T>::Vector(int n)
{ 
  data = new T[n]; 
  size = n;
};
 
template< class T >
   void Vector<T>::Run()
  {
   int n=size;
      Vector <int> X(n);
     
    cout<<"vvedite elementi"<<endl;
                for(int i=0; i<n;i++)
                 {cin>>X[i];} 
                     int temp;
        temp = X[0];
         for(int i=0; i<n; i++)
              {
                X[i] = temp*X[i];
                }
          for (int i = 0; i < n; i++)
     cout <<"  " << X[i] <<" ";;
  };
 
 
 
 
 
void main ()
{ 
    int n,k;
    cout<<"Vvedite n"<<endl;
    cin>>n;
 
  Vector <int> X(n);
  // Создаем объект  класса   "символьный вектор":
  Vector <char> C (n) ;
  Vector <double> D (n);
   
 cout<<"S kakim tipom hotite rabotat?"<<endl;
 cout<<"1. int"<<endl;
 cout<<"2. char"<<endl;
 cout<<"3. double"<<endl;
 cin>>k;
  // Определяем компоненты векторов:
 
  switch (k) 
{ 
  case 1: X.Run();
                /*cout<<"vvedite elementi"<<endl;
                for(int i=0; i<n;i++)
                 {cin>>X[i];} 
                     int temp;
        temp = X[0];
         for(int i=0; i<n; i++)
              {
                X[i] = temp*X[i];
                }
  for (int i = 0; i < n; i++)
     cout <<"  " << X[i] <<"  ";;   */   
      break; 
      
  case 3: 
         cout<<"vvedite elementi"<<endl;
        for(int i=0; i<n;i++)
        {cin>>D[i];} 
             double temp2;
         temp2 = D[0];
         for(int i=0; i<n; i++)
             {
                    D[i] = D[i];
             }
          for (int i = 0; i < n; i++)
         cout <<"  "  << D[i];; break;
 
  case 2: 
        cout<<"vvedite elementi"<<endl;
        for(int i=0; i<n;i++)
        {cin>>C[i];} 
                      for (int i = 0; i < n; i++)
                        cout <<"  "  << C[i]; ; break;
     default: "Viberite pravilno!"; 
} 
 Vector <int> A (3);
 Vector <int> B (3);
 Vector <int> J (3);
 cout<< C.Size()<<endl;
A=B;
 cout << "a1" << endl;
     //   int r; 
  
  //cout<<"Resultat = "<<X.Res()<<endl;
  //cout<<"Res = "<<sun<<endl;
  getch();
}

Помогите перегрузить операторы "+"(сложение элементов двух векторов) и "=". Вверху мои безуспешные попытки.

Добавлено через 5 часов 54 минуты
Помогите перегрузить завтра, уже сегодня, лабу надо сдавать. Пожалуйста....
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.05.2012, 00:58     Класс Vector
Посмотрите здесь:

Класс Vector и оператор new C++
C++ класс vector ошибка в push_back()
C++ Класс и vector
C++ создать класс шаблон Vector
C++ vector (шаблонный класс)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
 Аватар для Avazart
6910 / 5150 / 253
Регистрация: 10.12.2010
Сообщений: 22,657
Записей в блоге: 17
14.05.2012, 01:22     Класс Vector #2
А с этим что разве не работает
C++
1
2
3
4
5
6
 template <class T> Vector<T> operator+( Vector<T> &A)
  {
     Vector <T> B(A.Size());
     for(int i=0;i<size;i++){ B[i]=data[i]+A[i];}
     return B;
  }
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
14.05.2012, 01:36     Класс Vector #3
да там конструктор копирования кривой. тот, который по дефолту генерится. вот чистый вектор без дополнительных примочек (исключения, какие-то левые функции и т.п.), которые у вас присутствуют. их вы сами себе снова сможете вставить:

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
#include <cassert>
#include <utility>
#include <iostream>
 
using namespace std;
 
template <class T>
class Vector
{
  T* m_data;
  unsigned m_size;
 
 public:
  explicit Vector(unsigned size, const T& val = T())
    : m_data(0)
    , m_size(0)
  {
    assert(size != 0);
    m_size = size;
    m_data = new T[size];
    for (unsigned i = 0; i < size; ++i)
    {
      m_data[i] = val;
    }
  }
 
  Vector(const Vector& other)
    : m_data(0)
    , m_size(0)
  {
    Vector tmp(other.m_size);
    for (unsigned i = 0; i < other.m_size; ++i)
    {
      tmp.m_data[i] = other.m_data[i];
    }
    Swap(tmp);
  }
 
  Vector& operator = (const Vector& other)
  {
    if (this != &other)
    {
      Vector tmp(other);
      Swap(tmp);
    }
    return *this;
  }
 
  ~Vector()
  {
    delete[] m_data;
  }
 
  void Swap(Vector& other)
  {
    std::swap(m_data, other.m_data);
    std::swap(m_size, other.m_size);
  }
 
  unsigned Size() const
  {
    return m_size;
  }
 
  T& operator[] (unsigned index)
  {
    assert(m_size > index);
    return m_data[index];
  }
 
  const T& operator[] (unsigned index) const
  {
    assert(m_size > index);
    return m_data[index];
  }
 
  Vector& operator += (const Vector& other)
  {
    assert(m_size == other.m_size);
    for (unsigned i = 0; i < m_size; ++i)
      m_data[i] += other.m_data[i];
    return *this;
  }
};
 
template <class T>
Vector<T> operator + (const Vector<T>& lhs, const Vector<T>& rhs)
{
  Vector<T> result(lhs);
  result += rhs;
  return result;
}
 
template <class T>
ostream& operator << (ostream& out, const Vector<T>& vec)
{
  for (unsigned i = 0, end = vec.Size(); i != end; ++i)
  {
    out << vec[i] << ";";
  }
  return out;
}
 
int main()
{
  typedef Vector<int> IntVector;
 
  IntVector v1(5u, 2);
  cout << "Vector1: " << v1 << std::endl;
 
  IntVector v2 = v1;
  v2 += v1;
  cout << "Vector2: " << v2 << std::endl;
 
  v2 = v1;
  cout << "Vector2: " << v2 << std::endl;
 
  IntVector v3 = v1 + v2 + v1;
  cout << "Vector3: " << v3 << std::endl;
 
  return 0;
}
Есть косячок в плане безопасности исключений в конструкторе, но с этим вам жить можно
Alexex
0 / 0 / 0
Регистрация: 22.12.2011
Сообщений: 23
14.05.2012, 19:00  [ТС]     Класс Vector #4
Ох, объясните, по хардкору, что это?
Цитата Сообщение от DU Посмотреть сообщение
: m_data(0)
, m_size(0)
Цитата Сообщение от DU Посмотреть сообщение
explicit()
Swap(tmp);
Это? И в чем суть этим двух неведомых библиотек.

#include <utility>
#include <iostream>
Avazart
 Аватар для Avazart
6910 / 5150 / 253
Регистрация: 10.12.2010
Сообщений: 22,657
Записей в блоге: 17
14.05.2012, 19:07     Класс Vector #5
C++
1
2
#include <utility>
 #include <iostream>
И в чем суть этим двух неведомых библиотек
вообщето они стандартные std::, учите с++
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
14.05.2012, 19:24     Класс Vector #6
Цитата Сообщение от Alexex Посмотреть сообщение
: m_data(0)
, m_size(0)
Список инициализации. Суть в том, что если для члена класса не указать инициализацию в списке инициализации (во как))), то компилятор сгенерирует для него вызов конструктора по умолчанию (если он есть, конечно). Т.е. вот такое:
C++
1
2
3
4
5
6
7
8
struct my_type {
    my_type(std::string const& str) {
        m_str = str;
    }
 
private:
    std::string m_str;
};
развернётся в такое
C++
1
2
3
4
5
6
7
8
struct my_type {
    my_type(std::string const& str) : m_str() {
        m_str = str;
    }
 
private:
    std::string m_str;
};
Т.е. по сути вызывается конструктор по умолчанию, а потом присваивание. Для встроеных типов это не актуально, а вот для пользовательских ещё как, ибо вместо "вызов конструтора" имеем "вызов конструктора по умолчанию + вызов оператора присваивания". + константы можно инициализировать только через этот список.
explicit
Это запрет на неявный вызов конструктора преобразования (с одним аргументом), т.е. на неявное преобразование из аргумента в тип. Вообще полезно в англ.-русс. словарик иногда заглядывать - название => смысл.

Добавлено через 57 секунд
Цитата Сообщение от Alexex Посмотреть сообщение
И в чем суть этим двух неведомых библиотек.
#include <utility>
#include <iostream>
))) только сейчас заметил)
Alexex
0 / 0 / 0
Регистрация: 22.12.2011
Сообщений: 23
14.05.2012, 19:34  [ТС]     Класс Vector #7
А "assert()" - что делает.
gray_fox, DU - спасибо вам.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
14.05.2012, 19:38     Класс Vector #8
Цитата Сообщение от Alexex Посмотреть сообщение
assert()
Проверка во время исполнения. Если в параметре false, то приложение будет прервано с ошибкой + небольшое поянение (где-что). Соль в том, что работает только в режиме отладки, соберёшь в release - и никаких проверок не будет.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
14.05.2012, 20:29     Класс Vector #9
по хорошему в место ассертов должны быть исключения или какая-то другая осмысленная обработка. мне это делать было лень.
Alexex
0 / 0 / 0
Регистрация: 22.12.2011
Сообщений: 23
20.05.2012, 19:13  [ТС]     Класс Vector #10
А почему тут мы переменную val приравниваем к T(), объясните именно почему шаблонный тип Т со скобками?
C++
1
explicit Vector(unsigned size, const T& val = T())
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.05.2012, 19:54     Класс Vector
Еще ссылки по теме:

Задания на класс vector C++
Класс содержащий vector C++
Шаблонный класс vector C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
20.05.2012, 19:54     Класс Vector #11
Цитата Сообщение от Alexex Посмотреть сообщение
почему тут мы переменную val приравниваем к T()
После равно - значение по умолчанию. Если будет вызов без указания этого аргумента, то он примет это значение. Т.е. если так
C++
1
Vector<int> vector(4, 5);
то val == 5, если так
C++
1
Vector<int> vector(4);
то val == 0. T() - вызов конструтора по умолчанию, для int вернёт 0.
Yandex
Объявления
20.05.2012, 19:54     Класс Vector
Ответ Создать тему
Опции темы

Текущее время: 16:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru