Поиск:

Ответ в темуСоздание новой темы Создание опроса
> стандартные алгоритмы, Unique( stat,end) 
:(
    Опции темы
ano360
Дата 24.1.2007, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 22.5.2006
Где: Москва

Репутация: нет
Всего: нет



круто, но мне ещё ведь надо и удалить все лишние эл-ты, а не только отсортировать, а моя ф-я делает итои другое.



--------------------
Жизнь есть.
PM MAIL WWW ICQ   Вверх
segmentation_fault
Дата 24.1.2007, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 14.2.2005
Где: в интернете

Репутация: нет
Всего: 1



ano360, а почему бы тебе не отсортировать сначала вектор стандартным алгоритмом, а потом применить unique, как это обьяснил Vyacheslav, т.к. в отсортированном векторе,  все одинаковые элементы теперь действительно будут последовательными. 
PM MAIL   Вверх
Vyacheslav
Дата 24.1.2007, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Цитата(segmentation_fault @  24.1.2007,  00:01 Найти цитируемый пост)
создай сет, скопируй туда содержимое вектора, очисти вектор и скопируй туда содержимое сета. Одинаковые элементы в сет не копируются, так что получишь то, что хотел.   


Логично smile
Код

#pragma hdrstop
#include <iterator>
#include<vector>
#include<set>
#include <algorithm>
#include <iostream>



//---------------------------------------------------------------------------

#pragma argsused
using namespace std;

template< class T>
void my_unique(vector<T>& tmp)
{
    set<T> set_tmp(tmp.begin(), tmp.end());
    vector<T>(set_tmp.begin(),set_tmp.end()).swap(tmp);
}


int main(int argc, char* argv[])
{
    int temp[10] = { 1,2,3,4,5,1,2,3,4, 6  };
    vector<int> vectorTemp(temp, temp + 10);
   
    //вывод на консоль содержимого вектора 
    copy(vectorTemp.begin(),vectorTemp.end(),ostream_iterator< int, char >(cout," "));
    cout << endl;

    my_unique( vectorTemp );

     //вывод на консоль содержимого вектора  после удаления дубликатов
    copy(vectorTemp.begin(),vectorTemp.end(),ostream_iterator< int, char >(cout," "));
    cout << endl;
    return 0;
}
//---------------------------------------------------------------------------



Можно задействовать  и sort c unique
Код

template< class T>
void my_unique(vector<T>& tmp)
{
    sort(tmp.begin(), tmp.end());
    tmp.erase(unique(tmp.begin(), tmp.end()), tmp.end());
}



Добавлено @ 20:08 
Кстати для понимания работы unique посмотрите, что получится, если просто вызвать unique без erase
Код

void my_unique(vector<T>& tmp)
{
    sort(tmp.begin(), tmp.end());
    //tmp.erase(unique(tmp.begin(), tmp.end()), tmp.end());
    unique(tmp.begin(), tmp.end()); // грубая ошибка
}  



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
ano360
Дата 24.1.2007, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 22.5.2006
Где: Москва

Репутация: нет
Всего: нет



segmentation_fault-Вы считаете это будет работать быстрее чем нов. функция?


--------------------
Жизнь есть.
PM MAIL WWW ICQ   Вверх
stmamont
Дата 24.1.2007, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 343
Регистрация: 13.3.2004
Где: влг

Репутация: 3
Всего: 3



ano360, быстрее чем твоя - точно. особенно при больших объемах данных. и уж точно - надежно


--------------------
user posted image
PM MAIL ICQ   Вверх
Vyacheslav
Дата 25.1.2007, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Кстати в первом варианте сделал ошибку. Конечно же надо было
Код

template< class T>
void my_unique(vector<T>& tmp)
{
    //set<int> set_tmp(tmp.begin(), tmp.end());
    set<T> set_tmp(tmp.begin(), tmp.end());
    //vector<int>(set_tmp.begin(),set_tmp.end()).swap(tmp);
    vector<T>(set_tmp.begin(),set_tmp.end()).swap(tmp);
}




--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0585 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.