Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Контейнер уникальных значений без operator< 
V
    Опции темы
Earnest
Дата 24.6.2011, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



А зачем что-то копировать?
Просто memcmp (this, &that, sizeof (*this)); вполне достаточно.
Если у тебя там есть не POD члены или даблы или указатели или виртуальные функции (ну, последнее вроде не должно мешать, но я обычно все равно делю), то нужно отделить суп от мух: т.е. сделать POD-структуру с простыми полями, которую включить в класс (или унаследоваться). Это по-любому не вредно для дизайна - отделять простые POD-структуры от сложных



--------------------
...
PM   Вверх
borisbn
Дата 24.6.2011, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



Цитата(Earnest @  24.6.2011,  14:43 Найти цитируемый пост)
Просто memcmp (this, &that, sizeof (*this)); вполне достаточно

как справедливо заметил volatile в другой теме из-за мусора при выравнивании такое лучше не использовать. Мало того, мне не по всем полям сравнивать надо.

Цитата(Earnest @  24.6.2011,  14:43 Найти цитируемый пост)
Если у тебя там есть не POD члены

есть (QString), но ради оператора < дробить структуру на две (типа базовая cо сравниваемыми POD'ами и наследник с QString'ом и доп.полями)... ну, может и имеет смысл, но как-то слишком замысловато IMHO

Это сообщение отредактировал(а) borisbn - 24.6.2011, 14:54


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
azesmcar
Дата 24.6.2011, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата(borisbn @  24.6.2011,  13:11 Найти цитируемый пост)
P.S. Откуда цитата ?

из стандарта.

Цитата(borisbn @  24.6.2011,  13:11 Найти цитируемый пост)
Что тогда посоветуете ?

согласен с Earnest по поводу хэш контейнеров.
PM   Вверх
Earnest
Дата 24.6.2011, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(borisbn @  24.6.2011,  15:32 Найти цитируемый пост)
а я тем более не представляю, как её сделать...

Ну, один пример (для 2 чисел) я тебе привела. Можно и развить.

Или так: здесь key - это указатель на строку, идем до ее конца, для массива интов сам напишешь.
Код

       nHash = 0;
       while (*key)
        nHash = (nHash<<5) + nHash + *key++;

Смысл в том, чтобы все хорошенько перемешать. На самом деле, в качестве хэша можно возвращать любое целое число - хоть константу, работать будет (но медленно: свалит все в одну корзину). Или просто использовать одно из твоих полей, наиболее часто меняющееся. Или два.

Добавлено через 3 минуты и 27 секунд
Цитата(borisbn @  24.6.2011,  15:53 Найти цитируемый пост)
из-за мусора при выравнивании такое лучше не использовать

Да, верно, просто я у тебя только инты видела...  видимо, для примера упростил. Кроме того, я обычно POD-структурам делаю базовую инициализацию (ZeroMemory), а уже потом поля пихаю. И никакого мусора.

Добавлено через 5 минут и 48 секунд
Цитата(borisbn @  24.6.2011,  15:53 Найти цитируемый пост)
ну, может и имеет смысл, но как-то слишком замысловато IMHO

Ну хотя бы подряд ты их расположить можешь? Т.е. стринг либо сзаду, либо спереду, и сравнивать блок. Есть ведь оператор получения офсета мембера - что-то вроде offsetof.


--------------------
...
PM   Вверх
borisbn
Дата 24.6.2011, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



Цитата(azesmcar @  24.6.2011,  14:54 Найти цитируемый пост)
из стандарта.

упс. до 25.3 Sorting and related operations как-то не добрался. остановился на std::set и find

Цитата(Earnest @  24.6.2011,  14:56 Найти цитируемый пост)
На самом деле, в качестве хэша можно возвращать любое целое число - хоть константу, работать будет (но медленно: свалит все в одну корзину)

хммм... будет работать ??? тогда буду пробовать. да мне быстро и не надо.

Цитата(azesmcar @  24.6.2011,  14:54 Найти цитируемый пост)
согласен с Earnest по поводу хэш контейнеров.

уговорили smile

спасибо ещё раз всем

тему пока не закрываю - проверю всё - отпишусь.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
azesmcar
Дата 24.6.2011, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата(borisbn @  24.6.2011,  15:12 Найти цитируемый пост)
хммм... будет работать ??? тогда буду пробовать. да мне быстро и не надо.

будет smile только сложность будет линейной.


Это сообщение отредактировал(а) azesmcar - 24.6.2011, 15:17
PM   Вверх
Earnest
Дата 24.6.2011, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(borisbn @  24.6.2011,  16:12 Найти цитируемый пост)
будет работать ???

Это только теоретически. А как реализован конкретный контейнер - хз, может и чего-нибудь выкинуть, а я потом виновата буду.
Кроме того, это эквивалентно линейному списку без всякого упорядочивания - т.е. линейный поиск. Для этого дела хэш-контейнер и заводить не стоит.
Короче, это была шутка.  smile 
И я ведь привела тебе пример, как хэш строить.



--------------------
...
PM   Вверх
borisbn
Дата 24.6.2011, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



ну, что ж, уподобимся янки - ВАУ, Работает ! smile
Код

struct X {
...
    int a;
    int b;
...
    bool operator==( const X & that ) const {
        return this->a == that.a && this->b == that.b;
    }
};
inline uint qHash( const X & ) { return 42; }
typedef QSet< X > XSet;
XSet m_xs;

...

X x1( 1, 2 );
m_xs.insert( x1 );
x1.b = 3;
m_xs.insert( x1 );
XSet::const_iterator found = m_xs.find( X( 1, 2 ) ); // != .end()
bool isIn = m_xs.contains( X( 1, 3 ) ); // true
isIn = m_xs.contains( X( 1, 1 ) ); // false



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
borisbn
Дата 24.6.2011, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



Цитата(Earnest @  24.6.2011,  15:18 Найти цитируемый пост)
Кроме того, это эквивалентно линейному списку без всякого упорядочивания - т.е. линейный поиск. Для этого дела хэш-контейнер и заводить не стоит.

я уже говорил, что скорость мне не важна, и можно и руками сделать, но
Цитата(borisbn @  24.6.2011,  10:40 Найти цитируемый пост)
Можно, конечно, повелосипедировать: аггрегировать вектор и написать ф-цию добавления и поиска... но хочется сначала выяснить, нет ли готового решения

в принципе hash за небольшим оверхедом - и есть такое решение. исчо раз спасибо.

Цитата(Earnest @  24.6.2011,  15:18 Найти цитируемый пост)
А как реализован конкретный контейнер - хз, может и чего-нибудь выкинуть, а я потом виновата буду.

могу сказать про себя - ты точно не будешь виноватой. Я ж понимаю, что совет на форуме - это хорошо, а проверять, проверять и ещё раз проверять © самизнаетекто - никто не отменял.

Я тут подумал - даже теоретически не важно, как реализован контейнер (главное, чтоб без ошибок), т.к. ведь может такое случиться, что ключи у двух разных структур пересекутся.... А где у двух, там и у трёх, четырёх ---> у всех smile Та не, должна работать константа. Тем более такая, как 42 smile


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Earnest
Дата 24.6.2011, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Не, я так не могу... это же вопиющее нарушение мировой гармонии! Даже если 42!
Вот зачем я тебе про константу сказала! Количество мирового зла в виде кривого кода возросло, а тепловая смерть вселенной и так не за горами... Надеюсь, ты просто попробовал, а делать будешь нормально...


--------------------
...
PM   Вверх
borisbn
Дата 24.6.2011, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



Цитата(Earnest @  24.6.2011,  15:18 Найти цитируемый пост)
И я ведь привела тебе пример, как хэш строить.

спасибо. В какой-нить другой задаче обязательно воспользуюсь. В данной конкретной у меня будут 20..30 (ну может 50) уникальных структур. А поиск будет инициироваться по кнопке. СтОит ли заморачиваться ?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
azesmcar
Дата 24.6.2011, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата(borisbn @  24.6.2011,  16:22 Найти цитируемый пост)
спасибо. В какой-нить другой задаче обязательно воспользуюсь. В данной конкретной у меня будут 20..30 (ну может 50) уникальных структур. А поиск будет инициироваться по кнопке. СтОит ли заморачиваться ? 

ну заведи вектор тогда, зачем использовать хэш контейнер не по назначению? smile 
PM   Вверх
borisbn
Дата 24.6.2011, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



Цитата(azesmcar @  24.6.2011,  16:24 Найти цитируемый пост)
ну заведи вектор тогда, зачем использовать хэш контейнер не по назначению?

Над ним обёртки нужны. Не то, чтобы лень писать (делов то - полчаса с отладкой, да и, возможно, так и сделаю в итоге), просто хотелось узнать нет ли решения, которое идеально мне подходит. Убедился, что нет. Тоже результат smile

Цитата(borisbn @  24.6.2011,  10:40 Найти цитируемый пост)
Можно, конечно, повелосипедировать: аггрегировать вектор и написать ф-цию добавления и поиска... но хочется сначала выяснить, нет ли готового решения




--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
borisbn
Дата 25.6.2011, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



Цитата(azesmcar @  24.6.2011,  16:24 Найти цитируемый пост)
ну заведи вектор тогда, зачем использовать хэш контейнер не по назначению?

всё-таки решил повелосипедировать, т.к. готового решения конкретно этой задачи нет...
вот что получилось

Код

#include <vector>
#include <algorithm>
#include <functional>

template< class T, class Compare = std::equal_to< T > >
class UniqueContainer
{
private:
    typedef std::vector< T > container_t;
public:
    typedef typename container_t::const_iterator const_iterator;
    typedef typename container_t::iterator iterator;

    bool contains( const T & value ) const {
        return std::find_if( m_container.begin(),
                             m_container.end(),
                             std::bind1st( m_compare, value )
                           ) != m_container.end();
    }

    bool push_back( const T & value ) {
        if ( contains( value ) ) {
            return false;
        }
        m_container.push_back( value );
        return true;
    }
    const_iterator begin() const {
        return m_container.begin();
    }
    iterator begin() {
        return m_container.begin();
    }
    const_iterator end() const {
        return m_container.end();
    }
    iterator end() {
        return m_container.end();
    }
    
private:
    container_t m_container;
    Compare m_compare;
};

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

struct S {
    int a;
    int b;
    S( int a_a = 0, int a_b = 0 )
        : a( a_a ), b( a_b )
    {
    }
    bool operator==( const S & that ) const {
        return this->a == that.a && this->b == that.b;
    }
};

#include <iostream>
int main() {
    typedef UniqueContainer< S > Container;
    Container v;
    v.push_back( S( 1, 1 ) );
    v.push_back( S( 2, 2 ) );
    v.push_back( S( 1, 1 ) );
    
    for ( Container::const_iterator it = v.begin(); it != v.end(); ++it ) {
        std::cout << (*it).a << " " << (*it).b << std::endl;
    }
}


http://liveworkspace.org/code/33a67804f759...f03796f9ec3c230


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
mes
Дата 25.6.2011, 10:47 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

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



Цитата(borisbn @  25.6.2011,  07:33 Найти цитируемый пост)
вот что получилось

и охота же было из за одной функции писать целую обертку..  smile 
вот что значит _поклоняться_ классам, думая что соблюдаете ООП... 





--------------------
PM MAIL WWW   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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