Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
Katysha_
0 / 0 / 0
Регистрация: 21.11.2015
Сообщений: 5
1

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

21.11.2015, 17:27. Просмотров 647. Ответов 9
Метки нет (Все метки)

Здравствуйте! Помогите пожалуйста!
Есть задание: Удалить из списка элементы с повторяющимися более одного раза
значениями.
Есть программа, работает правильно, но нужно функцию 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.11.2015, 17:27
Ответы с готовыми решениями:

Удалить из файла все слова, встречающиеся более одного раза
Найти в файле f все слова которые встречаются более одного раза выбросить их из...

Удалить из строки все символы встречающиеся более одного раза
ввести символьную строку удалить из строки все символы встречающиеся более...

Удалить из предложения слова, которые встретились в нем более одного раза
Ввести предложение, слова в котором разделены пробелами и запятыми. Распечатать...

Удалить из списка все элементы с нечётными значениями и вывести указатель p2 на начало преобразованного списка.
Здравствуйте. Не получается решить задачу. Условие. Дан непустой двусвязный...

Выбрать все элементы массива встречающиеся более одного раза
В массиве из n элементов выбрать без повторений все элементы, встречающиеся...

9
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7058 / 3360 / 455
Регистрация: 04.12.2011
Сообщений: 9,348
Записей в блоге: 5
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;
}
0
Katysha_
0 / 0 / 0
Регистрация: 21.11.2015
Сообщений: 5
21.11.2015, 19:39  [ТС] 3
Спасибо большое за помощь
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7058 / 3360 / 455
Регистрация: 04.12.2011
Сообщений: 9,348
Записей в блоге: 5
21.11.2015, 19:42 4
Цитата Сообщение от Katysha_ Посмотреть сообщение
Спасибо большое за помощь
Не за что. Предложенный подход нивелирует преимущество списка. Все итераторы теряют валидность.
Лучше конечно Вам самой написать функцию поиска элемента. А в чём проблема?
0
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;
}
но преподаватель требует по новым стандартам языка С++
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7058 / 3360 / 455
Регистрация: 04.12.2011
Сообщений: 9,348
Записей в блоге: 5
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;
}
Может кто-то еще чего подкинет.
Удачи.
0
Katysha_
0 / 0 / 0
Регистрация: 21.11.2015
Сообщений: 5
21.11.2015, 20:48  [ТС] 7
Спасибо, Вам буду разбираться)
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7058 / 3360 / 455
Регистрация: 04.12.2011
Сообщений: 9,348
Записей в блоге: 5
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;
}
Вот обобщённый и "перегруженный" (для значения) велосипед. Его можете запрячь прямо в свой код.
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;
}
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7058 / 3360 / 455
Регистрация: 04.12.2011
Сообщений: 9,348
Записей в блоге: 5
21.11.2015, 22:15 10
Цитата Сообщение от Katysha_ Посмотреть сообщение
Спасибо огромное, вы мне очень помогли с этой задачей
Пожалуйста. Я не вполне понимаю в каком контексте тут упоминаются "новые" стандарты. Но главное, это то что форум это ещё и большая база данных. Вы можете искать ответы из поисковиков или разместив запрос непосредственно в поисковом поле форума. Вот почему правила предписывают писать один вопрос в одной теме и при этом стараться сочинить как можно более информативный заголовок. Потому как решенный вариант может помочь ещё кому-то, но ведь его надо для этого найти. Нет смысла в теме в которой куча разных задач, - найдут только титульную.
И потом это в Ваших же интересах начать новую тему, ибо немногим может захотеться помочь, видя перспективу получить "спасибо" без "чмоки-чмоки".
Только не вздумайте плюсовать, действительно.
Это я так шутю.
0
21.11.2015, 22:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.11.2015, 22:15

Вывести все элементы массива, встречающиеся более одного раза
Дана целочисленная последовательность (одномерный массив целых чисел). ...

Вывести все элементы массива входящие в него более одного раза
нужно вывести из заданного пользователем массива все элементы, встречающиеся в...

Найти все элементы массива, которые встречаются в нем не более одного раза
Нужна помощь. Задание такого : в двумерном массиве А найти все элементы,...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

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