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

Удалить из списка элементы с повторяющимися более одного раза значениями - C++

Восстановить пароль Регистрация
 
Katysha_
0 / 0 / 0
Регистрация: 21.11.2015
Сообщений: 5
21.11.2015, 17:27     Удалить из списка элементы с повторяющимися более одного раза значениями #1
Здравствуйте! Помогите пожалуйста!
Есть задание: Удалить из списка элементы с повторяющимися более одного раза
значениями.
Есть программа, работает правильно, но нужно функцию find реализовать самой, а не использовать библиотечную.
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 "stdafx.h"
#include "conio.h"
#include "stdio.h"
#include <iostream>
#include <ctime>
#include <list>
#include <algorithm>
using namespace std;
 
int  main(void) {
    srand(time(0));
    list<int> lst;
    int N = 20;
    for (int i = 0; i<N; ++i)
    {
        lst.push_back(rand() % 20);
    }
    cout << endl;
    for (auto i : lst)
    {
        cout << i << " ";
    }
    cout << endl;
    
 
    int ch;
    list<int>::iterator ptr;
    for (list<int>::iterator iter = lst.begin(); iter != lst.end(); *iter++) {
        if (count(lst.begin(), lst.end(), *iter) > 1) {
            ch = *iter;
            while ((ptr = find(lst.begin(), lst.end(), ch)) != lst.end())
                lst.erase(ptr);
            if (lst.size() > 0u)
                iter = lst.begin();
            else
                break;
        }
    }
 
    for (; !lst.empty(); lst.pop_front())
        cout << lst.front()<<endl;
    cout.put('\n');
    cin.get();
    system("pause");
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.11.2015, 17:27     Удалить из списка элементы с повторяющимися более одного раза значениями
Посмотрите здесь:

Выбрать элементы массива, встречающихся более одного раза. Pascal
удалить из строки все символы встречающиеся более одного раза C++
Delphi Выбрать элементы, встречающихся в последовательности А более одного раза.
Удалить из массива элементы, встречающиеся более одного раза Turbo Pascal
QBasic В матрице А(N,N) найти элементы, встречающиеся более одного раза
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,712
Записей в блоге: 3
21.11.2015, 19:22     Удалить из списка элементы с повторяющимися более одного раза значениями #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
#include <iostream>
#include <ctime>
#include <list>
#include <set>
using namespace std;
 
int  main(void) {
    srand((int)time(0));
    list<int> lst;
    int N = 20;
    for (int i = 0; i<N; ++i)
    {
        lst.push_back(rand() % 20);
    }
    cout << endl;
     list<int>::iterator ptr;
    for (list<int>::iterator iter = lst.begin(); iter != lst.end(); *iter++)
    {
        cout << *iter << " ";
    }
    cout << endl;
    
 set<int> mySet;
for (list<int>::iterator iter = lst.begin(); iter != lst.end(); *iter++)
    {
        mySet.insert(*iter);
    }
   lst.clear();
  
   set<int>::iterator itSet=mySet.begin();
   for(;itSet!=mySet.end(); itSet++)
   {
lst.push_back(*itSet);
   }
for (list<int>::iterator iter = lst.begin(); iter != lst.end(); *iter++)
    {
        cout << *iter << " ";
    }
    
    cout << endl;    
    system("pause");
    return 0;
}
Katysha_
0 / 0 / 0
Регистрация: 21.11.2015
Сообщений: 5
21.11.2015, 19:39  [ТС]     Удалить из списка элементы с повторяющимися более одного раза значениями #3
Спасибо большое за помощь
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,712
Записей в блоге: 3
21.11.2015, 19:42     Удалить из списка элементы с повторяющимися более одного раза значениями #4
Цитата Сообщение от Katysha_ Посмотреть сообщение
Спасибо большое за помощь
Не за что. Предложенный подход нивелирует преимущество списка. Все итераторы теряют валидность.
Лучше конечно Вам самой написать функцию поиска элемента. А в чём проблема?
Katysha_
0 / 0 / 0
Регистрация: 21.11.2015
Сообщений: 5
21.11.2015, 19:50  [ТС]     Удалить из списка элементы с повторяющимися более одного раза значениями #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
#include "stdafx.h"
#include "conio.h"
#include "stdio.h"
#include <iostream>
#include <ctime>
#include <list>
#include <cstdlib>
using namespace std;
int main()
{
    const int size = 20;
    int array[size];
    int i, j;
    srand((unsigned)time(0));
    int count = 0;
 
    for (i = 0; i < size; i++)
        array[i] = rand() % 20;
 
    for (i = 0; i < size; i++)
        cout << array[i] << " ";
    cout << endl;
 
    for (i = 0; i < size; i++)
    {
        int temp = array[i];
 
        for (j = 0; j < size; j++)
            if (temp == array[j])
                count++;
        if (count == 1)
            cout << temp << " ";
        count = 0;
    }
    system("pause");
    cout << endl;
}
но преподаватель требует по новым стандартам языка С++
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,712
Записей в блоге: 3
21.11.2015, 20:27     Удалить из списка элементы с повторяющимися более одного раза значениями #6
Katysha_, я не понял Ваш код с массивом. Вот "велосипедик", он не защищен от передачи невалидного итератора, но так быстрее. Если хотите добавьте вначале пробег по списку для выяснения является ли start указателем на какой-либо элемент и если нет возвращайте 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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <iostream>
#include <ctime>
#include <list>
#include <set>
 
using namespace std;
//ищет *toFindTo начиная с start и если найдёт возвращает итератор находки а если не найдёт то end()
list<int>::iterator findInList(list<int> &lst, list<int>::iterator &start, list<int>::iterator &toFindTo)
{
    if(start==lst.end())return start;
list<int>::iterator ptr=start;
ptr++;
for(; ptr!=lst.end(); ptr++)
{
if(*ptr==*toFindTo)break;
}
return ptr;
}
 
int  main(void) {
srand((int)time(0));
    list<int> lst;
    int N = 20;
    for (int i = 0; i<N; ++i)
    {
        lst.push_back(rand() % 20);
    }
    cout << endl;
     list<int>::iterator ptr;
    for (list<int>::iterator iter = lst.begin(); iter != lst.end(); *iter++)
    {
        cout << *iter << " ";
    }
    cout << endl;
 
list<int>::iterator iterFound;
 for (list<int>::iterator iter = lst.begin(); iter != lst.end(); *iter++)
 {
iterFound= findInList(lst, iter, iter);
cout<<"try to find "<<*iter<<" found ";
if(iterFound!=lst.end())cout<<*iterFound;
else cout<<"noting";
cout<<endl;
 }
 
 
cout << endl;
    system("pause");
    return 0;
}
Может кто-то еще чего подкинет.
Удачи.
Katysha_
0 / 0 / 0
Регистрация: 21.11.2015
Сообщений: 5
21.11.2015, 20:48  [ТС]     Удалить из списка элементы с повторяющимися более одного раза значениями #7
Спасибо, Вам буду разбираться)
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,712
Записей в блоге: 3
21.11.2015, 21:16     Удалить из списка элементы с повторяющимися более одного раза значениями #8
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
template<class T>
typename list<T>::iterator
findInList(list<T> &lst, typename list<T>::iterator &start, typename list<T>::iterator &toFindTo)
{
list<T>::iterator ptr=start;
for(; ptr!=lst.end(); ptr++)
{
if(*ptr==*toFindTo)break;
}
return ptr;
}
 
 
template<class T>
typename list<T>::iterator
findInList(list<T> &lst, typename list<T>::iterator &start, T toFindTo)
{
list<T>::iterator ptr=start;
for(; ptr!=lst.end(); ptr++)
{
if(*ptr==toFindTo)break;
}
return ptr;
}
 
int  main(void) {
srand((int)time(0));
    list<int> lst;
    int N = 20;
    for (int i = 0; i<N; ++i)
    {
        lst.push_back(rand() % 20);
    }
    cout << endl;
     list<int>::iterator ptr;
    for (list<int>::iterator iter = lst.begin(); iter != lst.end(); *iter++)
    {
        cout << *iter << " ";
    }
    cout << endl;
 
list<int>::iterator iterFound;
 for (list<int>::iterator iter = lst.begin(); iter != lst.end(); *iter++)
 {
     list<int>::iterator iterBeg=iter;
iterBeg++;//что бы себя не находила
iterFound= findInList(lst, iterBeg, iter);
cout<<"try to find "<<*iter<<" found ";
if(iterFound!=lst.end())cout<<*iterFound;
else cout<<"noting";
cout<<endl;
 }
cout << endl;
    system("pause");
    return 0;
}
Вот обобщённый и "перегруженный" (для значения) велосипед. Его можете запрячь прямо в свой код.
Katysha_
0 / 0 / 0
Регистрация: 21.11.2015
Сообщений: 5
21.11.2015, 22:01  [ТС]     Удалить из списка элементы с повторяющимися более одного раза значениями #9
Спасибо огромное, вы мне очень помогли с этой задачей
Можно у вас еще попросить о помощи с другими задачами, может подскажете что?

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
#include"stdafx.h"
#include<iostream>
using namespace std;
 
 
int main()
{
    setlocale(LC_CTYPE, "Russian");
    char a[]="";
    int  flag[15], k = 0, max, imax = 0;
 
    cout << "Заданныймассив: ";
    for (int i = 0; i<15; i++)
        cin >> a[i];
 
    for (int i = 0; i<15; i++)
        flag[i] = 0;
    for (int i = 0; i<14; i++)
    {
        if (flag[i] == 0)
        {
            for (int j = i + 1; j<15; j++)
                if (a[i] == a[j])
                {
                    k++;
                    flag[j] = k;
                }
            k = 0;
        }
        max = flag[0];
        for (int j = 0; j<15; j++)
        {
            if (flag[j]>max)
            {
                max = flag[j];
                imax = j;
            }
 
        }
 
    }
    
    cout << "Чаще встречается символ: " << a[imax] << endl;
    system("pause");
    return 0;
}
А вот как в новом стандарте сделать с использованием string не пойму


2. Создать массив размерностью 200 элементов со значениями от -50 до 50.
Определить среднюю длину непрерывных участков положительных чисел


А вот здесь хуже, никак не додумаюсь как вычислить эту среднюю длину и найти сами непрерывные участки
Вот все мои попытки
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
#include "stdafx.h"
#include "conio.h"
#include "stdio.h"
#include <iostream>
#include <ctime>
#include <vector>
using namespace std;
 
int main()
{
    srand(time(0));
    vector<int> mas;
    int N = 10, n = 0, cp = 0, pl = 0, i=0; 
    /*float srd = 0;*/
    for (int i = 0; i<N; ++i)
        mas.push_back(rand() % 100 - 50);
    cout << endl << "Ishodniy massiv:" << endl << endl;
    for (auto i : mas)
        cout << i << "   ";
    cout << endl << endl << endl;
    
 
    while (mas[i]>=0)
    {
        if (mas[i] < 0)
            
        pl++;
    }
    
 
 
    /*for (int i = 0; i < N; i++)
    {
        if (mas[i] >= 0)
 
            pl++;
    }
    for (int i = 0; i < N; i++)
    {
         if (mas[i] < 0)
        
            
            cp++;
    
        
        
    }
 
    pl += mas[i];
    n=pl / cp;*/
    
    /*for (int i = 0; i < N; i++)
    {
        if (mas[i] >= 0)
            pl++;
        else if (pl > 0)
            srd = (srd*cp+pl)/cp;
        cp++;
    }*/
    
    /*for (int i = 0; i<N; ++i)
    {
        if (mas[i] >= 0)
        n+=mas[i]; 
    }
 
    for (int i = 0; i<N; ++i)
    {
        if (mas[i] >= 0)
            sum++;
    }*/
 
    /*float srdl;
    srdl = n / sum;*/
    cout << "Srednyaya dlinna:" <<pl <<endl;
    cout << endl;
    system("pause");
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.11.2015, 22:15     Удалить из списка элементы с повторяющимися более одного раза значениями
Еще ссылки по теме:

В матрице найти элементы, встречающиеся более одного раза Turbo Pascal
Удалить элементы, которые встречаются более одного раза Matlab
C++ Удалить из файла все слова, встречающиеся более одного раза

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

Или воспользуйтесь поиском по форуму:
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,712
Записей в блоге: 3
21.11.2015, 22:15     Удалить из списка элементы с повторяющимися более одного раза значениями #10
Цитата Сообщение от Katysha_ Посмотреть сообщение
Спасибо огромное, вы мне очень помогли с этой задачей
Пожалуйста. Я не вполне понимаю в каком контексте тут упоминаются "новые" стандарты. Но главное, это то что форум это ещё и большая база данных. Вы можете искать ответы из поисковиков или разместив запрос непосредственно в поисковом поле форума. Вот почему правила предписывают писать один вопрос в одной теме и при этом стараться сочинить как можно более информативный заголовок. Потому как решенный вариант может помочь ещё кому-то, но ведь его надо для этого найти. Нет смысла в теме в которой куча разных задач, - найдут только титульную.
И потом это в Ваших же интересах начать новую тему, ибо немногим может захотеться помочь, видя перспективу получить "спасибо" без "чмоки-чмоки".
Только не вздумайте плюсовать, действительно.
Это я так шутю.
Yandex
Объявления
21.11.2015, 22:15     Удалить из списка элементы с повторяющимися более одного раза значениями
Ответ Создать тему
Опции темы

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