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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Gepar
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
#1

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

14.09.2011, 23:18. Просмотров 1138. Ответов 15
Метки нет (Все метки)

Что-то у меня сегодня вечер чудес просто таки. Применяю 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++):

Не работает метод unique_copy - C++
Добрый день! Помогите разобраться. Есть задача: прочитать слова, вывести, но убрать дубликаты, а также предварительно отсортировать....

Работа функции unique_copy () - C++
Почему в result после её работы встречаются одинаковые значения? #include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;algorithm&gt; ...

Почему алгоритм unique_copy не правильно работает с итераторами потоков? - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;iterator&gt; #include &lt;string&gt; #include &lt;algorithm&gt; #include &lt;vector&gt; using...

Не срабатывает gets - C++
Ребят, не пойму почему, но строка с gets в ниже приведенном коде игнорируется - ввести мне ничего не дает: int ch; char str; ...

Не срабатывает if - C++
Почему-то не срабатывает if при условии, что мы ввели единицу. Подскажите, пожалуйста, в чем причина. #include &lt;iostream&gt; using...

Не срабатывает - C++
Не хочет работать код, что тут не так? #include &lt;iostream&gt; using namespace std; class A{ public: int radok(int a, int b,...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
OstapBender
583 / 521 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
14.09.2011, 23:31 #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
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
14.09.2011, 23:37  [ТС] #3
OstapBender, а, точно, я забыл что отсортировать надо же.

Цитата Сообщение от OstapBender Посмотреть сообщение
они только перемешивают последовательность так, чтобы мы знали где заканчиваются норм. элементы и начинаются "удалённые", а затем можно делать resize.
Не, это вроде делает unique, а именно unique_copy копирует элементы.
grizlik78
Эксперт С++
1908 / 1440 / 111
Регистрация: 29.05.2011
Сообщений: 2,996
14.09.2011, 23:50 #4
Цитата Сообщение от Gepar Посмотреть сообщение
Не, это вроде делает unique, а именно unique_copy копирует элементы.
Да, копирует. Но копии не копируются только в том случае, если они стоят рядом, если же между двумя одинаковыми есть хотя бы один отличный от них элемент, то будут скопированы оба повторяющихся значения. Если задача позволяет, то можно предварительно отсортировать интервал, если нет, то unique вряд ли подходит. Надо идти по элементам и удалять каждый из них от следующей позиции до конца интервала.
Gepar
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
14.09.2011, 23:54  [ТС] #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
Эксперт С++
1908 / 1440 / 111
Регистрация: 29.05.2011
Сообщений: 2,996
15.09.2011, 00:00 #6
Есть множества (std::set), которые позволяют вставлять каждое значение только один раз, а остальные игнорируют.
Gepar
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
15.09.2011, 00:03  [ТС] #7
grizlik78, но они не будут считать сколько же у меня было попыток вхождения одного и того же значения ...
grizlik78
Эксперт С++
1908 / 1440 / 111
Регистрация: 29.05.2011
Сообщений: 2,996
15.09.2011, 00:08 #8
Цитата Сообщение от Gepar Посмотреть сообщение
а если уже была до этого то для этой пары счётчик её вхождений декриментировался.
По-моему меня сбило с толку слово декрементировался. Может счётчик инкрементироваться (увеличиваться) должен?
OstapBender
583 / 521 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
15.09.2011, 00:14 #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
Эксперт С++
1908 / 1440 / 111
Регистрация: 29.05.2011
Сообщений: 2,996
15.09.2011, 00:23 #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
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
15.09.2011, 01:38  [ТС] #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
583 / 521 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
15.09.2011, 01:47 #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
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
15.09.2011, 01:55  [ТС] #13
OstapBender, и правда, можно заменить, надо бы почитать как до конца работает этот map, ато оно то так работает, но я не понимаю до конца за счёт чего.

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

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

Catch(.) не срабатывает - C++
Имеется такой фрагмент код: HANDLE hData = GetClipboardData(CF_TEXT | CF_LOCALE); char* chBuffer = (char*)GlobalLock(hData); try...

Не срабатывает цикл FOR - C++
Начал писать программу. Компилятор игнорирует оператор FOR, при этом не каких ошибок не выдаёт. #include &quot;stdafx.h&quot; #include...

Не срабатывает вложенные If/else - C++
Написал программу, в программе в цикле while есть большой список if/else который по величине SS суммирует определенные ячейки массива...

Не срабатывает switch - C++
Не работает в коде свитч. При проверке значения, должна выполняться функция, а она не выполняется... В чем проблема? #include &lt;stdio.h&gt; ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
31.01.2013, 10:59
Ответ Создать тему
Опции темы

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