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

Не срабатывает unique_copy - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
14.09.2011, 23:18     Не срабатывает unique_copy #1
Что-то у меня сегодня вечер чудес просто таки. Применяю unique_copy, а по выводу результатов вижу что ничего не происходит и копии остаются:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int main()
{
    string s;
    string temp;
    ostream_iterator<string> print(cout," ");
//    cout<<"Enter string: ";
//    getline(cin,s);
    s="simplesimple";
    vector<string> str;
    vector<string> str2;
 
    //запихнуть в str пары букв из строки s
    for(int i=1;i<s.length();i++)
    {
        temp=s[i-1];
        temp+=s[i];
        str.push_back(temp);
    }
 
    unique_copy(str.begin(),str.end(),back_inserter(str2)); // убрать все копии пар символов
    copy(str2.begin(),str2.end(),print);
}
Добавлено через 5 минут
И заодно параллельный вопрос не касающийся работы unique_copy: может у нас есть чего чтобы подсчитывать количество вхождений пары символов, ну что-то вроде того чтобы при запихивании пары ab если такой ещё не было то она добавлялась и устанавливалось значение 1, а если уже была до этого то для этой пары счётчик её вхождений декриментировался.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.09.2011, 23:18     Не срабатывает unique_copy
Посмотрите здесь:

C++ Не срабатывает
C++ Не срабатывает сортировка
C++ Не срабатывает gets
C++ Работа функции unique_copy ()
C++ Не срабатывает вложенные If/else
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
14.09.2011, 23:31     Не срабатывает unique_copy #2
unique и unique_copy не удаляют элементы, потому что они не научены этого делать (как и любые СТЛовские изменяющие функции)
они только перемешивают последовательность так, чтобы мы знали где заканчиваются норм. элементы и начинаются "удалённые", а затем можно делать resize.

и да, кстати, он же вроде только соседние проверяет.

вроде так надо:
C++
1
2
3
sort(str.begin(),str.end());
it=unique_copy (str.begin(), str.end(), back_inserter(str2));
str2.resize(it - str2.begin() );
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
14.09.2011, 23:37  [ТС]     Не срабатывает unique_copy #3
OstapBender, а, точно, я забыл что отсортировать надо же.

Цитата Сообщение от OstapBender Посмотреть сообщение
они только перемешивают последовательность так, чтобы мы знали где заканчиваются норм. элементы и начинаются "удалённые", а затем можно делать resize.
Не, это вроде делает unique, а именно unique_copy копирует элементы.
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
14.09.2011, 23:50     Не срабатывает unique_copy #4
Цитата Сообщение от Gepar Посмотреть сообщение
Не, это вроде делает unique, а именно unique_copy копирует элементы.
Да, копирует. Но копии не копируются только в том случае, если они стоят рядом, если же между двумя одинаковыми есть хотя бы один отличный от них элемент, то будут скопированы оба повторяющихся значения. Если задача позволяет, то можно предварительно отсортировать интервал, если нет, то unique вряд ли подходит. Надо идти по элементам и удалять каждый из них от следующей позиции до конца интервала.
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
14.09.2011, 23:54  [ТС]     Не срабатывает unique_copy #5
grizlik78, да я уже вспомнил что надо предварительно отсортировать, вопрос же

Цитата Сообщение от Gepar Посмотреть сообщение
может у нас есть чего чтобы подсчитывать количество вхождений пары символов, ну что-то вроде того чтобы при запихивании пары ab если такой ещё не было то она добавлялась и устанавливалось значение 1, а если уже была до этого то для этой пары счётчик её вхождений декриментировался.
остаётся открытым, ато я написал мини программу решающую эту задачу, но вроде что-то было в stl что делает тоже самое ... или это мне только кажется. Мой код для решения этой задачи выглядит в итоге так:

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
int main()
{
    string s;
    string temp;
    ostream_iterator<string> print(cout," ");
    cout<<"Enter string: ";
    getline(cin,s);
    vector<string> str;
    vector<string> str2;
 
    //запихнуть в str пары букв из строки s
    for(int i=1;i<s.length();i++)
    {
        temp=s[i-1];
        temp+=s[i];
        str.push_back(temp);
    }
    sort(str.begin(),str.end());
    unique_copy(str.begin(),str.end(),back_inserter(str2));
//    copy(str2.begin(),str2.end(),print);
    for (int i=0;i<str2.size();i++)
    {
        cout<<str2[i]<<"\t"<<count(str.begin(),str.end(),str2[i])<<endl;
    }
}
Но если что-то есть в stl решающее эту задачу то думаю оно будет работать быстрее и эффективнее.
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
15.09.2011, 00:00     Не срабатывает unique_copy #6
Есть множества (std::set), которые позволяют вставлять каждое значение только один раз, а остальные игнорируют.
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
15.09.2011, 00:03  [ТС]     Не срабатывает unique_copy #7
grizlik78, но они не будут считать сколько же у меня было попыток вхождения одного и того же значения ...
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
15.09.2011, 00:08     Не срабатывает unique_copy #8
Цитата Сообщение от Gepar Посмотреть сообщение
а если уже была до этого то для этой пары счётчик её вхождений декриментировался.
По-моему меня сбило с толку слово декрементировался. Может счётчик инкрементироваться (увеличиваться) должен?
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
15.09.2011, 00:14     Не срабатывает unique_copy #9
ну можно свой велосипедик написать конечно.
что-т типа того
C++
1
2
3
4
5
6
7
8
std::copy_if(str.begin(),str.end(),std::back_inserter(str2), [] (char ch) {
static std::set<char> s;
if (s.find(ch)!=s.end()) // так ли?
return false;
 
return true;
 
});
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
15.09.2011, 00:23     Не срабатывает unique_copy #10
Цитата Сообщение от Gepar Посмотреть сообщение
grizlik78, но они не будут считать сколько же у меня было попыток вхождения одного и того же значения ...
В принципе ничего точно подходящего что-то пока не припоминается. Но последний цикл из твоей программы я бы, наверное, реализовывал как-нибудь так:
C++
1
2
3
4
5
6
7
8
9
    vector<string>::iterator
        it = str.begin(),
        end = str.end();
    while (it != end)
    {
        vector<string>::iterator last = upper_bound(it, end, *it);
        cout << *it << "\t" << distance(it, last) << endl;
        it = last;
    }
Тогда, может быть, и unique_copy не нужен. Но sort нужен всё-равно.
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
15.09.2011, 01:38  [ТС]     Не срабатывает unique_copy #11
Поразмыслив решил что для моей цели лучше всего подойдёт map.
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
int main()
{
    string s;
    string temp;
    cout<<"Enter string: ";
    getline(cin,s);
    map<string,int> str;
    map<string,int> :: iterator it;
 
    //запихнуть в str пары букв из строки s
    for(int i=1;i<s.length();i++)
    {
        temp=s[i-1];
        temp+=s[i];
        it=str.find(temp);
        if(it!=str.end())
        {
            it->second++;
        }
        else
        str.insert(pair<string,int>(temp,1));
    }
    for (it=str.begin();it!=str.end();it++)
    {
        cout<<(*it).first<<"\t"<<(*it).second<<endl;
    }
}
Добавлено через 2 минуты
Лучше всего в плане того что лишний вектор создавать не надо, сортировать нигде ничего не надо да и копировать из вектора в вектор тоже ничего не надо
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
15.09.2011, 01:47     Не срабатывает unique_copy #12
C++
1
2
3
4
5
6
7
        it=str.find(temp);
        if(it!=str.end())
        {
            it->second++;
        }
        else
        str.insert(pair<string,int>(temp,1));
это можно заменить строчкой
C++
1
str[temp]++;
ну и имечко str для мепа как-то неоч...
ну и + мелкий момент - зачем писать (*). если есть ->
ну и еще тогда - есть функция makepair ... чтоб не думать о типах.
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
15.09.2011, 01:55  [ТС]     Не срабатывает unique_copy #13
OstapBender, и правда, можно заменить, надо бы почитать как до конца работает этот map, ато оно то так работает, но я не понимаю до конца за счёт чего.

Цитата Сообщение от OstapBender Посмотреть сообщение
ну и имечко str для мепа как-то неоч...
так старый же код правил.

Цитата Сообщение от OstapBender Посмотреть сообщение
ну и + мелкий комент - зачем писать (*). если есть ->
Просто захотелось )
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
15.09.2011, 02:02     Не срабатывает unique_copy #14
да-да, почитайте, map это вещь полезная!
FarStar
Заблокирован
31.01.2013, 10:59     Не срабатывает unique_copy #15
вопрос снят разобрался
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.01.2013, 13:37     Не срабатывает unique_copy
Еще ссылки по теме:

Не срабатывает switch C++
Не работает метод unique_copy C++
C++ Не срабатывает цикл FOR

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

Или воспользуйтесь поиском по форуму:
Avazart
 Аватар для Avazart
6906 / 5146 / 253
Регистрация: 10.12.2010
Сообщений: 22,639
Записей в блоге: 17
31.01.2013, 13:37     Не срабатывает unique_copy #16
Цитата Сообщение от Gepar Посмотреть сообщение
Применяю unique_copy, а по выводу результатов вижу что ничего не происходит и копии остаются:
Последовательность должна быть предварительно отсортирована. ( ну либо сразу использовать std::set )
Yandex
Объявления
31.01.2013, 13:37     Не срабатывает unique_copy
Ответ Создать тему
Опции темы

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