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

АТД список. Сравнение элементов - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.91
Infinity3000
 Аватар для Infinity3000
1057 / 576 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
25.09.2011, 21:25     АТД список. Сравнение элементов #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 std::list;
using std::cout;
using std::cin;
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(0,"");//руский щрифт в консоле
    int n;
    char num;
    
    list<char> l; //объявили список
 
    cout << "Введите длину списка: ";
    cin >> n;
/**********************************заполнение списка********************************************/
    cout << "Введите содержимое списка: ";
    for(int i = 0; i < n; i++)
    {   
        cin >> num;
        l.push_front(num);
    }
/**********************************конец заполнение списка********************************************/  
 
    
    for(list<char>::iterator iter1 = l.begin(); iter1 != l.end(); iter1++)
    {
        // как тут сравнить два элемента списка
    }
    cout << "\n";
 
    system("pause >> NULL");
    return 0;
}
Спасибо!))
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
emilen
10 / 10 / 0
Регистрация: 25.05.2010
Сообщений: 52
25.09.2011, 21:54     АТД список. Сравнение элементов #2
Вы не написали какие элементы списка нужно сравнивать?! А вообще это делается с помощью итераторов, можно например сравнить так элемент в списке с предыдущим.
C++
1
2
3
4
5
6
7
8
9
10
list<char>::iterator j;
for (list<char>::iterator i = l.begin(); i != l.end(); ++i)
{
     if (i == l.begin()) ++i;
     j = i;
     --j;
     if (*i == *j) {
          // тут что нибудь делаем если равны
     }
}
Infinity3000
 Аватар для Infinity3000
1057 / 576 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
25.09.2011, 22:04  [ТС]     АТД список. Сравнение элементов #3
emilen, вы угадали мне именно так и надо было!!! Все четко работает!!

И подскажите теперь как удалить один из этих равных элементов!

Спасибо!
emilen
10 / 10 / 0
Регистрация: 25.05.2010
Сообщений: 52
25.09.2011, 22:14     АТД список. Сравнение элементов #4
Это выполняется функцией erase, у нее несколько параметров. Удалить один можно так.
C++
1
l.erase(i)
Infinity3000
 Аватар для Infinity3000
1057 / 576 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
25.09.2011, 22:31  [ТС]     АТД список. Сравнение элементов #5
Вот окончательный вариант

Условие:

Для каждого элемента списка L, удалить все его повторения, следующие непосредственно за ним.
Например, исходный список: (a a r d a a a r ), результат: (a r d a r)

Решение:

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
#include "iostream"
#include <list>
 
using std::list;
using std::cout;
using std::cin;
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(0,"");//руский щрифт в консоле
    int n;
    char num;
    
    list<char> l; //объявили список
 
    cout << "Введите длину списка: ";
    cin >> n;
/**********************************заполнение списка********************************************/
    cout << "Введите содержимое списка: ";
    for(int i = 0; i < n; i++)
    {   
        cin >> num;
        l.push_back(num);
    }
/**********************************конец заполнение списка********************************************/  
 
    list<char>::iterator j;
    for(list<char>::iterator iter1 = l.begin(); iter1 != l.end(); iter1++)
    {
        if (iter1 == l.begin()) //сравниваем элементы
            ++iter1;
 
        j = iter1;
    --j;
    if (*iter1 == *j) 
    {
        l.erase(j); // удалеем элемент
    }
    }
    cout << "\n";
 
/**********************************Выводим список********************************************/  
    cout << "Cписок без повторяющихся элементов: ";
 
    for(list<char>::iterator iter1 = l.begin(); iter1 != l.end(); iter1++)
    {
        cout << *iter1 << " ";
    }
    cout << "\n";
 
    system("pause >> NULL");
    return 0;
}
Может быть кому то понадобиться!)))
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
26.09.2011, 13:53     АТД список. Сравнение элементов #6
Цитата Сообщение от Infinity3000 Посмотреть сообщение
Для каждого элемента списка L, удалить все его повторения, следующие непосредственно за ним.
Зачем велосипеды изобретать.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <list>
#include <algorithm>
#include <iterator>
 
int main()
{
   char str[] = "aaaabbbcccccdddd";
   
   std::list<char> list(str, str + sizeof(str) / sizeof(*str) - 1);
   
   list.erase( std::unique( list.begin(), list.end() ), list.end() );
   
   std::copy( list.begin(), list.end(), std::ostream_iterator<char> (std::cout, " ") );
}
http://liveworkspace.org/code/ad9f00...bf82b6c1132d2b
Yandex
Объявления
26.09.2011, 13:53     АТД список. Сравнение элементов
Ответ Создать тему
Опции темы

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