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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
Alexex
0 / 0 / 0
Регистрация: 22.12.2011
Сообщений: 23
#1

Класс Vector - C++

14.05.2012, 00:58. Просмотров 1285. Ответов 10
Метки нет (Все метки)

Помогите молю. Нужно реализовать класс вектор как класс шаблон. Перегрузить операторы ввода-
вывода, сложение (сумма векторов), умножение (векторное произведение),
индексирование (доступ к компонентам вектора).

Добавлено через 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 (C++):

Базовый класс Complex и производный класс Vector - C++
Создайте базовый класс Complex (комплексное число) для реализации комплексных чисел в алгебраической форме и основных операций с ними:...

Класс и vector - C++
всем доброго времени суток,задача состоит в том что бы данные классов хранились в векторе,что я и пытался сделать. #include &lt;iostream&gt; ...

Класс Vector и оператор new - C++
Есть класс CItem Есть тип: typedef std::vector &lt;CItem&gt; ItemVector; typedef std::vector &lt;CItem&gt;::iterator Iter;Есть вектор и итератор:...

Задания на класс vector - C++
Помогите, пожалуйста, с задачей. Нужно добавить в вектор нечетные целые числа от -3 до 3. Удалить последнее число. Распечатать числа из...

Определить класс Vector - C++
Не могу понять оформление класса вектора. Перечитала лекцию, погуглила - инфы стало слишком много и я запуталась; все равно не могу...

Шаблонный класс vector - C++
Всем привет. Помогите создать шаблонный класс vector и массив который хранит значения template&lt;typename T, size_t size&gt; class array{ ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Avazart
Эксперт С++
7151 / 5328 / 277
Регистрация: 10.12.2010
Сообщений: 23,576
Записей в блоге: 17
14.05.2012, 01:22 #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
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
14.05.2012, 01:36 #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  [ТС] #4
Ох, объясните, по хардкору, что это?
Цитата Сообщение от DU Посмотреть сообщение
: m_data(0)
, m_size(0)
Цитата Сообщение от DU Посмотреть сообщение
explicit()
Swap(tmp);
Это? И в чем суть этим двух неведомых библиотек.

#include <utility>
#include <iostream>
Avazart
Эксперт С++
7151 / 5328 / 277
Регистрация: 10.12.2010
Сообщений: 23,576
Записей в блоге: 17
14.05.2012, 19:07 #5
C++
1
2
#include <utility>
 #include <iostream>
И в чем суть этим двух неведомых библиотек
вообщето они стандартные std::, учите с++
gray_fox
What a waste!
1511 / 1214 / 69
Регистрация: 21.04.2012
Сообщений: 2,550
Завершенные тесты: 3
14.05.2012, 19:24 #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  [ТС] #7
А "assert()" - что делает.
gray_fox, DU - спасибо вам.
gray_fox
What a waste!
1511 / 1214 / 69
Регистрация: 21.04.2012
Сообщений: 2,550
Завершенные тесты: 3
14.05.2012, 19:38 #8
Цитата Сообщение от Alexex Посмотреть сообщение
assert()
Проверка во время исполнения. Если в параметре false, то приложение будет прервано с ошибкой + небольшое поянение (где-что). Соль в том, что работает только в режиме отладки, соберёшь в release - и никаких проверок не будет.
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
14.05.2012, 20:29 #9
по хорошему в место ассертов должны быть исключения или какая-то другая осмысленная обработка. мне это делать было лень.
Alexex
0 / 0 / 0
Регистрация: 22.12.2011
Сообщений: 23
20.05.2012, 19:13  [ТС] #10
А почему тут мы переменную val приравниваем к T(), объясните именно почему шаблонный тип Т со скобками?
C++
1
explicit Vector(unsigned size, const T& val = T())
gray_fox
What a waste!
1511 / 1214 / 69
Регистрация: 21.04.2012
Сообщений: 2,550
Завершенные тесты: 3
20.05.2012, 19:54 #11
Цитата Сообщение от Alexex Посмотреть сообщение
почему тут мы переменную val приравниваем к T()
После равно - значение по умолчанию. Если будет вызов без указания этого аргумента, то он примет это значение. Т.е. если так
C++
1
Vector<int> vector(4, 5);
то val == 5, если так
C++
1
Vector<int> vector(4);
то val == 0. T() - вызов конструтора по умолчанию, для int вернёт 0.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.05.2012, 19:54
Привет! Вот еще темы с ответами:

Класс содержащий vector - C++
Вот я написал класс с использованием vector #include &lt;vector&gt; #include &lt;iostream&gt; using namespace std; class Vector { ...

Создать класс Vector 2D - C++
Создать класс Vector для работы с векторами на плоскости, содержащий следующие члены класса: 1. Поля: • int х, у; 2. ...

vector (шаблонный класс) - C++
Нужно создать простенький шаблонный класс вектор Подскажите пожалуйста , как написать запись элемента в начало вектора и в конец...

Перегрузка операторов. Класс VECTOR - C++
Задание 1: Разработка класса. Разработайте класс VECTOR. Элемент класса: координаты вектора. Методы: конструктор без...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
20.05.2012, 19:54
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru