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

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

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

удаление элемента - C++

31.10.2010, 00:16. Просмотров 1157. Ответов 20
Метки нет (Все метки)

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
#include <iostream>
#include <list>
using namespace std;
 
int main ()
{
  list<int> mylist;
  list<int>::iterator it;
  int size,b,m;
 
  
     cin >> size;
 
  m=0;
 
  for (int i=1; i<=size; i++)
  {  cin>>b;
      mylist.push_back(b);
  }
 
  it=mylist.begin();
  while (it!=mylist.end())
  {
 
if (*it==23)
mylist.remove(*it);
it++;
  }
it=mylist.begin();
while( it!=mylist.end())
{
    cout << *it<<endl;
    it++;
}
  return 0;
}

по идеии удалит все элементы которые равны 23 ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.10.2010, 00:16
Здравствуйте! Я подобрал для вас темы с ответами на вопрос удаление элемента (C++):

Вставка элемента в заданную позицию, удаление элемента по заданной позиции, поиск заданного элемента - C++
Добавить в класс &quot;Односвязный список&quot; следующие функции: вставка элемента в заданную позицию, удаление элемента по заданной позиции, поиск...

Описать класс «множество» (добавление и удаление элемента, пересечение, объединение и удаление множеств ) - C++
Описать класс «множество», позволяющий выполнять основные операции – добавление и удаление элемента, пересечение, объединение и удаление...

Сделать добавление элемента в массив и удаление элемента из массива используя STL - C++
Всем привет. Помогите пожалуйста написать. Нужно использовать STL. Необходимо сделать добавление элемента в массив и удаление элемента из...

Реализация списка.Удаление хвостового элемента.Поиск элемента - C++
Всем привет,мое задание выглядит так : В класс List&lt;T&gt; из классной работы добавить следующие методы: void addHead(T...

Удаление элемента из списка и поиск элемента - C++
Нужно удалить определенный элемент из списка. Найти элемент в списк и вывести на него всю информацию. Вот код. Не знаю как написать...

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
PointsEqual
ниначмуроФ
834 / 518 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
31.10.2010, 00:43 #2
неа, remove только перемещает элементы которые должны быть удалены и возвращает указатель на следующий за последним неудаленным, а элементы контейнера сдвигаются

нужно применять вместе с erase
C++
1
mylist.erase(remove(mylist.begin(), mylist.end(),23),mylist.end());
пример:
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
#include <iostream>
#include <list>
using namespace std;
 
int main ()
{
list<int> mylist;
list<int>::iterator it;
int size,b,m;
 
 
cin >> size;
 
m=0;
 
for (int i=1; i<=size; i++)
{ cin>>b;
mylist.push_back(b);
}
 
  for (it=mylist.begin(); it!=mylist.end(); it++)
    cout << " " << *it;
 
mylist.erase(remove(mylist.begin(), mylist.end(),23),mylist.end());
 
cout<<endl;
 
 
  for (it=mylist.begin(); it!=mylist.end(); it++)
    cout << " " << *it;
 
return 0;
}
TheMachinist
242 / 174 / 15
Регистрация: 14.06.2010
Сообщений: 422
31.10.2010, 00:48 #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
#include <iostream>
#include <list>
using namespace std;
 
int main ()
{
list<int> mylist;
list<int>::iterator it;
int size,b,m;
 
cin >> size;
 
m=0;
 
for (int i=1; i<=size; i++)
{ cin>>b;
mylist.push_back(b);
}
 
mylist.remove(23);
 
it=mylist.begin();
while( it!=mylist.end())
{
cout << *it<<endl;
it++;
}
system("pause");
return 0;
}
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
31.10.2010, 00:50 #4
deleted
PointsEqual
ниначмуроФ
834 / 518 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
31.10.2010, 00:51 #5
NikolaWhite, remove не удаляет
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
31.10.2010, 00:52 #6
PointsEqual, Листовский удаляет. Так говорит программа.
list->remove
PointsEqual
ниначмуроФ
834 / 518 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
31.10.2010, 01:00 #7
Цитата Сообщение от Lavroff Посмотреть сообщение
Листовский удаляет. Так говорит программа.
но почему? remove же работает только с некоторой последовательностью - перемещает, как он удаляет?
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
31.10.2010, 01:07 #8
PointsEqual, Листовский устроен по другому видать. По сути удаляем мы в векторе, массиве. Там нам действительно надо переместить элементы и последний всегда должен существовать.
Список. Мы удаляем узел, соединяем предыдущий с последующим и последующий с предыдущим. Перемещение элементов в списке, дабы удалить несколько или один - бессмысленная операция.
Но это как я это вижу. Ну да. Оказалось, что я почти прав.
Пруф: list->remove
В еще большее подтверждение определение list::remove в MSVS 2008.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    void remove(const _Ty& _Val_arg)
        {   // erase each element matching _Val
        /* Dinkumware makes a copy of _Val_arg in case it's removed along the way, i.e.
         * when the user pass an element of the list as _Val_arg.
         *
         * We believe that the signature of std::list::remove should be changed
         * from remove(const _Ty&) to remove(_Ty) to explicitly indicate that a copy is involved.
         */
        const _Ty _Val = _Val_arg;  // in case it's removed along the way
        iterator _Last = end();
        for (iterator _First = begin(); _First != _Last; )
            if (*_First == _Val)
                _First = erase(_First);
            else
                ++_First;
        }
и list::remove_if соответственно
C++
1
2
3
4
5
6
7
8
9
10
    template<class _Pr1>
        void remove_if(_Pr1 _Pred)
        {   // erase each element satisfying _Pr1
        iterator _Last = end();
        for (iterator _First = begin(); _First != _Last; )
            if (_Pred(*_First))
                _First = erase(_First);
            else
                ++_First;
        }
PointsEqual
ниначмуроФ
834 / 518 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
31.10.2010, 01:20 #9
а если для листа применить erase-remove это будет ошибкой?
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
31.10.2010, 01:22 #10
PointsEqual, нет. но зачем, если в list::remove итак вызывается erase?
Да и + это совершенно неоптимально. std::remove незаточен под списки все же.
cap
1 / 1 / 0
Регистрация: 27.10.2010
Сообщений: 51
31.10.2010, 01:35  [ТС] #11
Цитата Сообщение от Lavroff Посмотреть сообщение
PointsEqual, нет. но зачем, если в list::remove итак вызывается erase?
Да и + это совершенно неоптимально. std::remove незаточен под списки все же.
я тоже так думал но когда запускаю программу то ввожу размерность например 3 ввожу 1 23 45 и он мне продолжает предлагать вводить когда удаляю строку с remove все нормально

то есть если я ввожу без 23 все работает как ввожу так и выводит а если ввожу с 23 то все программа предлагать вводить,вводить ,вводить .....
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
31.10.2010, 01:40 #12
cap, Еще бы. Ща поясню фишку. Вы удаляете элемент. Итератор становится равен нулю. И затем вы пытаетесь его инкрементировать. Не самое хорошее решение, верно?
cap
1 / 1 / 0
Регистрация: 27.10.2010
Сообщений: 51
31.10.2010, 01:43  [ТС] #13
как же организовать удаление с условием?
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
31.10.2010, 01:45 #14
К примеру так.

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
#include <iostream>
#include <list>
#include <functional>
using namespace std;
 
int main ()
{
list<int> mylist;
list<int>::iterator it;
int size,b,m;
 
 
cin >> size;
 
m=0;
 
for (int i=1; i<=size; i++)
{ cin>>b;
mylist.push_back(b);
}
 
mylist.remove_if(std::bind2nd(std::equal_to<int>(), 23));
it=mylist.begin();
while(it!=mylist.end())
{
cout << *it<<endl;
it++;
}
return 0;
}
Или так.

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
#include <iostream>
#include <list>
#include <functional>
using namespace std;
 
int main ()
{
list<int> mylist;
list<int>::iterator it;
int size,b,m;
 
 
cin >> size;
 
m=0;
 
for (int i=1; i<=size; i++)
{ cin>>b;
mylist.push_back(b);
}
it=std::find(mylist.begin(), mylist.end(), 23);
if(it!=mylist.end())
    mylist.remove(*it);
it=mylist.begin();
while(it!=mylist.end())
{
cout << *it<<endl;
it++;
}
return 0;
}
cap
1 / 1 / 0
Регистрация: 27.10.2010
Сообщений: 51
31.10.2010, 01:51  [ТС] #15
или

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
#include <iostream>
#include <list>
#include <vector>
using namespace std;
 
int main ()
{
  list<int> mylist;
  list<int>::iterator it,it2;
  int size,b,m;
 
  cout<<"Введите размерность списка: ";
     cin >> size;
  m=0;
 
  for (int i=1; i<=size; i++)
  {  cin>>b;
      mylist.push_back(b);
  }
 
  it=mylist.begin();
mylist.remove(23);
it=mylist.begin();
while( it!=mylist.end())
{
    cout << *it<<endl;
    it++;
}
  return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.10.2010, 01:51
Привет! Вот еще темы с ответами:

Удаление элемента вектора - C++
Здравствуйте, мне нужно удалить из вектора элементы, которые делятся на 2 без остатка. Я ввожу 10 элементов вектора с клавиатуры, плюс в...

Удаление элемента структуры - C++
Есть код. Удаляет заданный элемент структуры. void list_del(list_head *list, int i){ if(list-&gt;head==NULL){printf(&quot;Список не...

Удаление элемента из списка - C++
Нужно удалить из списка элемент, стоящий после элемента на который указывает Р. Очень срочно надо! Заранее спасибо.

Удаление элемента из массива - C++
Требуется написать программу, имеющую главную программу и функцию. В главной программе производится ввод N ( количество элементов массива)...


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

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

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