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

C++, удаление элемента из списка "контейнера" - C++

Восстановить пароль Регистрация
 
deytas
-2 / 0 / 0
Регистрация: 29.06.2013
Сообщений: 6
29.06.2013, 12:56     C++, удаление элемента из списка "контейнера" #1
Всем привет, знаю что вы разбираетесь больше в программировании, я новичок еще новичок, объясните пожалуйста построчно как выполняются функции удаления в конец списка и в начало...

вот сама прога:
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
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
lab9_main.cpp:
 
#include  "Vector.h"  
#include  <iostream>  
#include <conio.h>
 
using  namespace  std;  
int main()  
{
  //контролируемый блок  
try
  {
                int i; 
          int mm[5]={1,2,3,4,5};
          Vector x(5,mm);//вектор из двух элементов  
  cout<<x()<<endl; //выведем размер x
  cout<<x;//печать вектора х
  cout<<"i:";
  cin>>i;
  cout<<endl<<"x[i]:"<<x[i]<<endl;
//удалить один элемент в конце вектора
  --x;
  cout<<x;
//удалить один элемент в начале вектора
  x--;
cout<<x;
 
  --x;  --x;  --x;
  cout<<x;
   --x;
   cout<<x;
  }
  //обработчик исключения  
  catch(int)
  {cout<<"ERROR!!!"<<endl;}//сообщение об ошибке
 
  _getch();
  return 0;
}
 
 
__________________________________________________________________
 
Vector.cpp:
 
 
#include "vector.h"
 
Vector::Vector( int s)
{
  //если текущий размер больше максимального, то генерируется исключение  
if(s>MAX_SIZE) throw 1;
  size=s;
  beg=new int [s];
  for(int i=0;i<size;i++)
    beg[i]=0;
}
Vector::Vector( const  Vector &v)  
{
  size=v.size;
  beg=new int [size];
  for(int i=0;i<size;i++)
    beg[i]=v.beg[i];
}
Vector::~Vector()  
{
  if (beg!=0) delete[]beg;
}
Vector::Vector( int s,int *mas)  
{
//если текущий размер больше максимального, то генерируется исключение  
if(s>MAX_SIZE) throw 1;
  size=s;
  beg=new int[size];
  for(int i=0;i<size;i++)
    beg[i]=mas[i];
}
const  Vector& Vector:: operator  =(const  Vector &v)  
{
  if(this==&v)return *this;
  if(beg!=0) delete []beg;
  size=v.size;
  beg=new int [size];
  for(int i=0;i<size;i++)
    beg[i]=v.beg[i];
  return*this;
}
 
ostream&  operator <<(ostream&out,  const  Vector&v)  
{
  if(v.size==0) out<<"Empty\n";
  else
  {
  for (int i=0;i<v.size;i++)
    out<<v.beg[i]<<" ";
  out<<endl;
  }
  return out;
}
istream&  operator  >>(istream&in, Vector&v)  
{
  for(int i=0;i<v.size;i++)
  {
    cout<<">";
    in>>v.beg[i];
  }
  return in;
}
int Vector:: operator  [](int i)
{
  if(i<0)throw 2;//если индекс отрицательный, то генерируется исключение  
  //если индекс больше размер вектора, то генерируется исключение  
  if(i>=size) throw 3;// error( "Vector length more  than MAXSIZE \n");
  return beg[i];
}
Vector Vector:: operator  +(int a)
{
//если при добавлении элемента размер вектора станет больше максимального,
//то генерируется исключение  
if(size+1==MAX_SIZE) throw 4;
  Vector temp(size+1,beg);  
  temp.beg[size]=a;
  return temp;
}
 
int Vector:: operator()()//определение размера вектора
{
        return size;
}
 
//удаление элемента в начале вектора
Vector Vector:: operator  --()
{
//если вектор пустой, то удалить элемент нельзи и генерируется исключение  
if(size==0) throw 5;
  if (size==1)//если в вектор один элемент  
  {
    size=0;
    delete[]beg;
    beg=0;
    return *this;
  };
  Vector temp(size,beg);
  delete[]beg;
  size--;
  beg=new int[size];
  for(int i=0;i<size;i++)
    beg[i]=temp.beg[i];
  return*this;
}
 
//удаление элемента в конце вектора
Vector Vector:: operator  --(int)
{
        Vector temp2(*this);
//если вектор пустой, то удалить элемент нельзи и генерируется исключение  
if(size==0) throw 5;
  if (size==1)//если в вектор один элемент  
  {
    size=0;
    delete[]beg;
    beg=0;
    return *this;
  };
  Vector temp(size,beg);
  delete[]beg;
  size--;
  beg=new int[size];
  for(int i=1;i<=size;i++)
    beg[i-1]=temp.beg[i];
  return temp2;
}
 
___________________________________________________________________________
 
Vector.h:
 
#pragma once
 
#pragma  once
#include  <iostream>  
using  namespace  std;  
const  int MAX_SIZE=30;//максимальный размер вектора  
class  Vector  
{
  int size;//текущий размер
  int *beg;//указатель на начало динамического массива  
public :
  Vector(){size=0;beg=0;}//конструктор без параметров  
  Vector(int s);//конструктор с параметром  
  Vector(int s,int* mas);//конструктор с параметром  
  Vector(const Vector&v);//конструктор копирования  
  ~Vector();//деструктор
  const Vector& operator=(const Vector&v);//операция присваивания
  int operator[](int i);//доступ по индексу
  Vector operator+(int a);//добавление элемента
  int operator()();//определение размера вектора
  Vector operator--();//удаление элемента в начало вектора
  Vector operator--(int);//удаление элемента в начало вектора
//дружественные функции ввода -вывода  
  friend ostream& operator<<(ostream&out,const Vector&v);
  friend istream& operator>>(istream& in, Vector&v);  
};
(код рабочий)

Интересно как находит нужный элемент и удаляет, да и объяснить еще нужно как построчно...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//удаление элемента в начале вектора 
Vector Vector:: operator --() 
{ 
//если вектор пустой, то удалить элемент нельзи и генерируется исключение 
if(size==0) throw 5; 
if (size==1)//если в вектор один элемент 
{ 
size=0; 
delete[]beg; 
beg=0; 
return *this; 
}; 
Vector temp(size,beg); 
delete[]beg; 
size--; 
beg=new int[size]; 
for(int i=0;i<size;i++)>=temp.beg; 
return*this; 
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//удаление элемента в конце вектора 
Vector Vector:: operator --(int) 
{ 
Vector temp2(*this); 
//если вектор пустой, то удалить элемент нельзи и генерируется исключение 
if(size==0) throw 5; 
if (size==1)//если в вектор один элемент 
{ 
size=0; 
delete[]beg; 
beg=0; 
return *this; 
}; 
Vector temp(size,beg); 
delete[]beg; 
size--; 
beg=new int[size]; 
for(int i=1;i<=size;i++) 
beg[i-1]=temp.beg; 
return temp2; 
}
с уважением.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.06.2013, 12:56     C++, удаление элемента из списка "контейнера"
Посмотрите здесь:

В одномерном массиве состоящим из "N" вещественных элементов вычислить сумму элемента массива с не четными "N" C++
Пользователь вводит с клавиатуры N чисел. Определить номер максимального элемента, выдав сообщение вида "Максимальный номер элемента был введен 7-м" C++
"Удаление" элемента списка C++
C++ Удаление элемента из списка и поиск элемента
Описать класс "множество", позволяющий выполнять основные операции - добавления и удаление элемента, пересечение, множеств, объединение и разность мно C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
el_gato_de_Ch
35 / 35 / 1
Регистрация: 28.04.2013
Сообщений: 110
29.06.2013, 14:09     C++, удаление элемента из списка "контейнера" #2
ну у вас перегружены операторы декремента, постфиксный удаляет конец, префиксный начало,

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Vector Vector:: operator --() 
{ 
//если вектор пустой, то удалить элемент нельзи и генерируется исключение 
if(size==0) throw 5; // сравнение с 0 лучше делать просто if (!size)
if (size==1)//если в вектор один элемент 
{ 
size=0;   // Я ДУМАЮ тут всё понятно, если один элемент, то мы просто очищаем занимаемую память.
delete[]beg; 
beg=0; 
return *this; 
}; 
Vector temp(size,beg); // если не 1 элемент, то создаём временный буфер куда копируем текущие значения,
delete[]beg;  // освобождаем память 
size--;  // уменьшаем размер 
beg=new int[size]; // выделяем новую память для нашего вектора
for(int i=0;i<size;i++)>=temp.beg; // вот тут чего-то не хватает, либо в моей голове, либо в коде, но эту строчку я не пойму
 // судя по всему должны копироваться нужные элементы. ИМХО можно было бы сделать проще
return*this; // возвращаем указатель на наш объект
}
не пойму зачем в Vector.h дважды #pragma once

ИМХО перегруз операции декремента, не самый удачный выбор для удаления последнего и первого элементов, ваш код становится плохо читаем, я читал в книге Голуба, что перегруз операций (названия функций) должены быть интуитивно понятны пользователю операция декремента -- ассоциируется с уменьшением величины, а не с удалением элементов из классов контейнера. Что например Вы будете делать, если потребуется удалять не с начала, а из середины ?
deytas
-2 / 0 / 0
Регистрация: 29.06.2013
Сообщений: 6
29.06.2013, 15:52  [ТС]     C++, удаление элемента из списка "контейнера" #3
действительно не хватает кода, не знаю почему не отобразилось, вот такой нод удаления
Цитата Сообщение от deytas Посмотреть сообщение
//удаление элемента в начале вектора
Vector Vector:: operator *--()
{
//если вектор пустой, то удалить элемент нельзи и генерируется исключение *
if(size==0) throw 5;
* if (size==1)//если в вектор один элемент *
* {
* * size=0;
* * delete[]beg;
* * beg=0;
* * return *this;
* };
* Vector temp(size,beg);
* delete[]beg;
* size--;
* beg=new int[size];
* for(int i=0;i<size;i++)
* * beg[i]=temp.beg[i];
* return*this;
}
а как он находит нужный элемент для удаления?? по заданию было удалить в начало и в конец... Интересно как удаляет в конец, т.е. как он определяет что нужно в конец удалить??@el_gato_de_Ch, спасибо что ответили. В цикле for получается заполняет новый список, но не включает в него элемент который нужно удалить было?? можно подробней про цикл for, не оч понятно...
el_gato_de_Ch
35 / 35 / 1
Регистрация: 28.04.2013
Сообщений: 110
29.06.2013, 16:30     C++, удаление элемента из списка "контейнера" #4
@deytas, т.е. это даже не удаление чтоли должно быть ?? а циклический сдвиг ?? так что ли ?? тогда процедура написана неправильно

объясните как должна работать процедура?

первый элемент должен перемещаться в конец вектора или он должен из него исчезать ?
deytas
-2 / 0 / 0
Регистрация: 29.06.2013
Сообщений: 6
29.06.2013, 20:28  [ТС]     C++, удаление элемента из списка "контейнера" #5
@el_gato_de_Ch,нет код правильный, все выполняется правильно, просто нужно объяснить мне его, а именно как он понимает что нужно удалить первый элемент в функции
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//удаление элемента в начале вектора
Vector Vector:: operator  --()
{
//если вектор пустой, то удалить элемент нельзи и генерируется исключение  
if(size==0) throw 5;
  if (size==1)//если в вектор один элемент  
  {
    size=0;
    delete[]beg;
    beg=0;
    return *this;
  };
  Vector temp(size,beg);
  delete[]beg;
  size--;
  beg=new int[size];
  for(int i=0;i<size;i++)
    beg[i]=temp.beg[i];
  return*this;
}
И как удаляет последний элемент, т.е. как находит и удаляет последний элемент в этой функции..

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//удаление элемента в конце вектора
Vector Vector:: operator  --(int)
{
        Vector temp2(*this);
//если вектор пустой, то удалить элемент нельзи и генерируется исключение  
if(size==0) throw 5;
  if (size==1)//если в вектор один элемент  
  {
    size=0;
    delete[]beg;
    beg=0;
    return *this;
  };
  Vector temp(size,beg);
  delete[]beg;
  size--;
  beg=new int[size];
  for(int i=1;i<=size;i++)
    beg[i-1]=temp.beg[i];
  return temp2;
}
Я по самому заданию сейчас не помню, но по коду все верно написано.. видимо удалять должен

Добавлено через 5 минут
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
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
lab9_main.cpp:
 
#include  "Vector.h"  
#include  <iostream>  
#include <conio.h>
 
using  namespace  std;  
int main()  
{
  //контролируемый блок  
try
  {
                int i; 
          int mm[5]={1,2,3,4,5};
          Vector x(5,mm);//вектор из двух элементов  
  cout<<x()<<endl; //выведем размер x
  cout<<x;//печать вектора х
  cout<<"i:";
  cin>>i;
  cout<<endl<<"x[i]:"<<x[i]<<endl;
//удалить один элемент в конце вектора
  --x;
  cout<<x;
//удалить один элемент в начале вектора
  x--;
cout<<x;
 
  --x;  --x;  --x;
  cout<<x;
   --x;
   cout<<x;
  }
  //обработчик исключения  
  catch(int)
  {cout<<"ERROR!!!"<<endl;}//сообщение об ошибке
 
  _getch();
  return 0;
}
 
 
__________________________________________________________________
 
Vector.cpp:
 
 
#include "vector.h"
 
Vector::Vector( int s)
{
  //если текущий размер больше максимального, то генерируется исключение  
if(s>MAX_SIZE) throw 1;
  size=s;
  beg=new int [s];
  for(int i=0;i<size;i++)
    beg[i]=0;
}
Vector::Vector( const  Vector &v)  
{
  size=v.size;
  beg=new int [size];
  for(int i=0;i<size;i++)
    beg[i]=v.beg[i];
}
Vector::~Vector()  
{
  if (beg!=0) delete[]beg;
}
Vector::Vector( int s,int *mas)  
{
//если текущий размер больше максимального, то генерируется исключение  
if(s>MAX_SIZE) throw 1;
  size=s;
  beg=new int[size];
  for(int i=0;i<size;i++)
    beg[i]=mas[i];
}
const  Vector& Vector:: operator  =(const  Vector &v)  
{
  if(this==&v)return *this;
  if(beg!=0) delete []beg;
  size=v.size;
  beg=new int [size];
  for(int i=0;i<size;i++)
    beg[i]=v.beg[i];
  return*this;
}
 
ostream&  operator <<(ostream&out,  const  Vector&v)  
{
  if(v.size==0) out<<"Empty\n";
  else
  {
  for (int i=0;i<v.size;i++)
    out<<v.beg[i]<<" ";
  out<<endl;
  }
  return out;
}
istream&  operator  >>(istream&in, Vector&v)  
{
  for(int i=0;i<v.size;i++)
  {
    cout<<">";
    in>>v.beg[i];
  }
  return in;
}
int Vector:: operator  [](int i)
{
  if(i<0)throw 2;//если индекс отрицательный, то генерируется исключение  
  //если индекс больше размер вектора, то генерируется исключение  
  if(i>=size) throw 3;// error( "Vector length more  than MAXSIZE \n");
  return beg[i];
}
Vector Vector:: operator  +(int a)
{
//если при добавлении элемента размер вектора станет больше максимального,
//то генерируется исключение  
if(size+1==MAX_SIZE) throw 4;
  Vector temp(size+1,beg);  
  temp.beg[size]=a;
  return temp;
}
 
int Vector:: operator()()//определение размера вектора
{
        return size;
}
 
//удаление элемента в начале вектора
Vector Vector:: operator  --()
{
//если вектор пустой, то удалить элемент нельзи и генерируется исключение  
if(size==0) throw 5;
  if (size==1)//если в вектор один элемент  
  {
    size=0;
    delete[]beg;
    beg=0;
    return *this;
  };
  Vector temp(size,beg);
  delete[]beg;
  size--;
  beg=new int[size];
  for(int i=0;i<size;i++)
    beg[i]=temp.beg[i];
  return*this;
}
 
//удаление элемента в конце вектора
Vector Vector:: operator  --(int)
{
        Vector temp2(*this);
//если вектор пустой, то удалить элемент нельзи и генерируется исключение  
if(size==0) throw 5;
  if (size==1)//если в вектор один элемент  
  {
    size=0;
    delete[]beg;
    beg=0;
    return *this;
  };
  Vector temp(size,beg);
  delete[]beg;
  size--;
  beg=new int[size];
  for(int i=1;i<=size;i++)
    beg[i-1]=temp.beg[i];
  return temp2;
}
 
___________________________________________________________________________
 
Vector.h:
 
#pragma once
 
#pragma  once
#include  <iostream>  
using  namespace  std;  
const  int MAX_SIZE=30;//максимальный размер вектора  
class  Vector  
{
  int size;//текущий размер
  int *beg;//указатель на начало динамического массива  
public :
  Vector(){size=0;beg=0;}//конструктор без параметров  
  Vector(int s);//конструктор с параметром  
  Vector(int s,int* mas);//конструктор с параметром  
  Vector(const Vector&v);//конструктор копирования  
  ~Vector();//деструктор
  const Vector& operator=(const Vector&v);//операция присваивания
  int operator[](int i);//доступ по индексу
  Vector operator+(int a);//добавление элемента
  int operator()();//определение размера вектора
  Vector operator--();//удаление элемента в начало вектора
  Vector operator--(int);//удаление элемента в начало вектора
//дружественные функции ввода -вывода  
  friend ostream& operator<<(ostream&out,const Vector&v);
  friend istream& operator>>(istream& in, Vector&v);  
};
а то что int *beg;//указатель на начало динамического массива , мы его чистим в функции, тем образом освобождаем память? или здесь как то по другому делается? ссори за глупый вопрос, для себя интересно)
el_gato_de_Ch
35 / 35 / 1
Регистрация: 28.04.2013
Сообщений: 110
29.06.2013, 23:53     C++, удаление элемента из списка "контейнера" #6
Цитата Сообщение от deytas Посмотреть сообщение
а то что int *beg;//указатель на начало динамического массива , мы его чистим в функции, тем образом освобождаем память? или здесь как то по другому делается? ссори за глупый вопрос, для себя интересно)
функция delete[] beg освобождает память, которую ранее выделили, это примерно как снести дом, была площадь застроена зданием, мы пришли убрали его и теперь место по этому адресу освободилось можно по новой занимать

в общем и целом у тебя всё выглядит так:
1. скопировали данные в некий буфер
2. освободили текущую память
3. из буфера забрали только нужное
4. .....
5. PROFIT !!!!!11

Всё шаманство происходит в цикле for(), там скорее происходит не удаление элемента, а просто его некопирование, т.е. был набор элементов, а мы скопировали всё кроме того что нам не нужен, ну а как его выбрать - так это же проще простого, у тебя всё время происходит удаление либо сначала, либо с конца, т.е. "ненужный" элемент будет находится с краю =) его и долой.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.07.2013, 00:00     C++, удаление элемента из списка "контейнера"
Еще ссылки по теме:

Удаление элемента списка и всего списка C++
Удалить из двусвязного списка все элементы до первого "*" и после последнего "*" C++
C++ Создать список из целых чисел. После каждого элемента, равного "х" вставить элемент, равный "у"

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

Или воспользуйтесь поиском по форуму:
deytas
-2 / 0 / 0
Регистрация: 29.06.2013
Сообщений: 6
01.07.2013, 00:00  [ТС]     C++, удаление элемента из списка "контейнера" #7
el_gato_de_Ch, спасибо большое за разьеснение, надеюсь поможет мне на защите)
Yandex
Объявления
01.07.2013, 00:00     C++, удаление элемента из списка "контейнера"
Ответ Создать тему
Опции темы

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