Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
1 / 1 / 0
Регистрация: 27.10.2010
Сообщений: 51
1

удаление элемента

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

Author24 — интернет-сервис помощи студентам
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 ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.10.2010, 00:16
Ответы с готовыми решениями:

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

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

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

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

20
ниначмуроФ
851 / 535 / 110
Регистрация: 12.10.2009
Сообщений: 1,913
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;
}
0
246 / 178 / 47
Регистрация: 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;
}
1
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
31.10.2010, 00:50 4
deleted
0
ниначмуроФ
851 / 535 / 110
Регистрация: 12.10.2009
Сообщений: 1,913
31.10.2010, 00:51 5
NikolaWhite, remove не удаляет
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
31.10.2010, 00:52 6
PointsEqual, Листовский удаляет. Так говорит программа.
list->remove
0
ниначмуроФ
851 / 535 / 110
Регистрация: 12.10.2009
Сообщений: 1,913
31.10.2010, 01:00 7
Цитата Сообщение от Lavroff Посмотреть сообщение
Листовский удаляет. Так говорит программа.
но почему? remove же работает только с некоторой последовательностью - перемещает, как он удаляет?
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
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;
        }
1
ниначмуроФ
851 / 535 / 110
Регистрация: 12.10.2009
Сообщений: 1,913
31.10.2010, 01:20 9
а если для листа применить erase-remove это будет ошибкой?
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
31.10.2010, 01:22 10
PointsEqual, нет. но зачем, если в list::remove итак вызывается erase?
Да и + это совершенно неоптимально. std::remove незаточен под списки все же.
0
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 то все программа предлагать вводить,вводить ,вводить .....
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
31.10.2010, 01:40 12
cap, Еще бы. Ща поясню фишку. Вы удаляете элемент. Итератор становится равен нулю. И затем вы пытаетесь его инкрементировать. Не самое хорошее решение, верно?
0
1 / 1 / 0
Регистрация: 27.10.2010
Сообщений: 51
31.10.2010, 01:43  [ТС] 13
как же организовать удаление с условием?
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
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;
}
0
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;
}
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
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;
}
0
1 / 1 / 0
Регистрация: 27.10.2010
Сообщений: 51
31.10.2010, 01:57  [ТС] 17
вот с циклом надо
просто суть в том что мне надо удалить повторяющиеся элементы
я хочу сделать вложенный циклы во внешнем буду брать элемент и сравнивать его со всеми во внутреннем если он повторится более 2х раз то удаляю и тд ...это возможно организовать с итераторами или я мудрю?
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
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;
}
0
1 / 1 / 0
Регистрация: 27.10.2010
Сообщений: 51
31.10.2010, 02:08  [ТС] 19
блин)точно) спасибо)
еще один вопрос работает он только числами или символами тоже?
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
31.10.2010, 02:12 20
cap, Со всем. Хоть со строками. Список же шаблонный класс.
1
31.10.2010, 02:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.10.2010, 02:12
Помогаю со студенческими работами здесь

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

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

Удаление элемента из вектора
подскажите пытаюсь удалить элемент из int вектора вот таким образом #include &lt;iostream&gt; #include...

Удаление элемента из массива
Доброго времени суток. Помогите, пожалуйста,найти ошибку и исправить её. Надо заполнить...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru