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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
cap
1 / 1 / 0
Регистрация: 27.10.2010
Сообщений: 51
31.10.2010, 00:16     удаление элемента #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
#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++
C++ Удаление элемента из vector
Удаление элемента C++
C++ Удаление элемента из списка и поиск элемента
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 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
 Аватар для 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
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
31.10.2010, 00:50     удаление элемента #4
deleted
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
31.10.2010, 00:51     удаление элемента #5
NikolaWhite, remove не удаляет
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
31.10.2010, 00:52     удаление элемента #6
PointsEqual, Листовский удаляет. Так говорит программа.
list->remove
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
31.10.2010, 01:00     удаление элемента #7
Цитата Сообщение от Lavroff Посмотреть сообщение
Листовский удаляет. Так говорит программа.
но почему? remove же работает только с некоторой последовательностью - перемещает, как он удаляет?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
31.10.2010, 01:20     удаление элемента #9
а если для листа применить erase-remove это будет ошибкой?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
31.10.2010, 01:40     удаление элемента #12
cap, Еще бы. Ща поясню фишку. Вы удаляете элемент. Итератор становится равен нулю. И затем вы пытаетесь его инкрементировать. Не самое хорошее решение, верно?
cap
1 / 1 / 0
Регистрация: 27.10.2010
Сообщений: 51
31.10.2010, 01:43  [ТС]     удаление элемента #13
как же организовать удаление с условием?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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;
}
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
31.10.2010, 01:52     удаление элемента #16
Если очень хочется через цикл то так. Или ваш вариант по сути вполне подойдет) Цикл там незачем.

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
#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++));
        continue;
    }
    ++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:57  [ТС]     удаление элемента #17
вот с циклом надо
просто суть в том что мне надо удалить повторяющиеся элементы
я хочу сделать вложенный циклы во внешнем буду брать элемент и сравнивать его со всеми во внутреннем если он повторится более 2х раз то удаляю и тд ...это возможно организовать с итераторами или я мудрю?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
31.10.2010, 02:06     удаление элемента #18
cap, Есть метод unique.

Добавлено через 2 минуты
Как-то так, если не напрягаться.
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
#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.sort();
mylist.unique();
 
 
 
it=mylist.begin();
while( it!=mylist.end())
{
cout << *it<<endl;
it++;
}
 
 
return 0;
}
cap
1 / 1 / 0
Регистрация: 27.10.2010
Сообщений: 51
31.10.2010, 02:08  [ТС]     удаление элемента #19
блин)точно) спасибо)
еще один вопрос работает он только числами или символами тоже?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.10.2010, 02:12     удаление элемента
Еще ссылки по теме:

C++ Описать класс «множество» (добавление и удаление элемента, пересечение, объединение и удаление множеств )
C++ Удаление элемента из вектора
Сделать добавление элемента в массив и удаление элемента из массива используя STL C++

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
31.10.2010, 02:12     удаление элемента #20
cap, Со всем. Хоть со строками. Список же шаблонный класс.
Yandex
Объявления
31.10.2010, 02:12     удаление элемента
Ответ Создать тему
Опции темы

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