std::includes и vector<string>
От: igna Россия  
Дата: 07.09.09 16:53
Оценка: 17 (1)
Алгоритм std::includes занимается ерундой выполняя две операции сравнения (x < y и y < x) там где достаточно одной (compare(x, y)):

    vector<string> vs1, vs2;
    . . .
    includes
        ( vs1.begin(), vs1.end()
        , vs2.begin(), vs2.end()
        );


Для типов с компаратором, возвращающим целое число, можно написать свой алгоритм, выполняющий в 2 раза меньше операций сравнения:

template <class II1, class II2, class COMP>
inline bool includes_comp
    ( II1 first1, II1 const last1
    , II2 first2, II2 const last2
    , COMP const compare
    )
{
    while (first1 != last1 && first2 != last2) {
        int const i(compare(*first1, *first2));
        if (i > 0)
            return false;
        if (i == 0)
            ++first2;
        ++first1;
    }
    return first2 == last2;
}


    vector<string> vs1, vs2;
    . . .
    int (string::*compare)(string const&) const (&string::compare);
    includes_comp
        ( vs1.begin(), vs1.end()
        , vs2.begin(), vs2.end()
        , mem_fun_ref(compare)
        );
Re: std::includes и vector<string>
От: remark Россия http://www.1024cores.net/
Дата: 07.09.09 18:30
Оценка: +1
Здравствуйте, igna, Вы писали:

I>Алгоритм std::includes занимается ерундой выполняя две операции сравнения (x < y и y < x) там где достаточно одной (compare(x, y)):


Издержки обобщения...


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[2]: std::includes и vector<string>
От: igna Россия  
Дата: 08.09.09 06:14
Оценка:
Здравствуйте, remark, Вы писали:

R>Издержки обобщения...


Понятно. А ведь случай типа с компаратором совсем не редкий, могли бы и в стандартную библиотеку соответствующие алгоритмы ввести. В Boost-е тоже таких алгоритмов нет, и, кстати, в Boost-е вообще не так много алгоритмов, в процентах точно меньше чем в STL.
Re[3]: std::includes и vector<string>
От: Alexander G Украина  
Дата: 08.09.09 06:40
Оценка:
Здравствуйте, igna, Вы писали:

I> А ведь случай типа с компаратором совсем не редкий, могли бы и в стандартную библиотеку соответствующие алгоритмы ввести.


То же самое для сортировок. И ещё, если бы возравщалось больше/меньше/равно, легче было бы получить сортировку в обратную сторону из прямого, например, lexicographical_compare
Русский военный корабль идёт ко дну!
Re[4]: std::includes и vector<string>
От: Кодт Россия  
Дата: 08.09.09 09:03
Оценка: 1 (1)
Здравствуйте, Alexander G, Вы писали:

AG>То же самое для сортировок. И ещё, если бы возравщалось больше/меньше/равно, легче было бы получить сортировку в обратную сторону из прямого, например, lexicographical_compare


Что значит "легче"?
Чтобы развернуть трёхзначный компаратор cmp(x,y)->[-1..+1], нужно применить отрицание: cmp'(x,y) = -cmp(x,y)
Чтобы развернуть булевский less(x,y)->bool — нужно обменять аргументы: greater(x,y) = less(y,x)

Я берусь написать обе ФВП за одну минуту
bind(unary_negate<int>(), bind(cmp3, _1, _2)));
bind(cmp2, _2, _1);
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Перекуём баги на фичи!
Re[3]: std::includes и vector<string>
От: Кодт Россия  
Дата: 08.09.09 09:22
Оценка:
Здравствуйте, igna, Вы писали:

R>>Издержки обобщения...


Я бы даже сказал, издержки академичности.

Кроме того, в синтаксисе языка есть операторы сравнения — предикаты отношений порядка и эквивалентности. И они работают и используются предсказуемо.
Оператор разности же
— во-первых, не очень естественно его применять для чего-то помимо чисел (string("hello")-string("world") == -1?)
— во-вторых, для беззнаковых чисел он ведёт себя иначе, и не может применяться для сравнения.
А какого-то специального оператора знаковой разности просто нет.

Поэтому предикаты обобщать — естественно для языка, а разность — не очень-то.

I>Понятно. А ведь случай типа с компаратором совсем не редкий, могли бы и в стандартную библиотеку соответствующие алгоритмы ввести.


STL идеологически цельная. Она всюду использует открытые справа полуинтервалы. И всюду использует отношения строгого порядка.
Переделать её под другой базис можно, но это будет другая библиотека.

I>В Boost-е тоже таких алгоритмов нет, и, кстати, в Boost-е вообще не так много алгоритмов, в процентах точно меньше чем в STL.


Считать количество алгоритмов в процентах — это смешная затея.
Но если очень хочется, то берём хотя бы Boost Graph Library и переплёвываем STL сразу и надолго.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Перекуём баги на фичи!
Re[4]: std::includes и vector<string>
От: igna Россия  
Дата: 08.09.09 09:39
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Считать количество алгоритмов в процентах — это смешная затея.

К>Но если очень хочется, то берём хотя бы Boost Graph Library и переплёвываем STL сразу и надолго.

Boost Graph Library и есть одна из немногих библиотек с большой, возможно даже с бОльшей долей алгоритмов чем STL. Но сами по себе библиотеки с большой долей алгоритмов составляют небольшую долю Boost-а.
Re[5]: std::includes и vector<string>
От: AndrewJD США  
Дата: 08.09.09 10:56
Оценка:
Здравствуйте, igna, Вы писали:

I>Boost Graph Library и есть одна из немногих библиотек с большой, возможно даже с бОльшей долей алгоритмов чем STL. Но сами по себе библиотеки с большой долей алгоритмов составляют небольшую долю Boost-а.

Наверное это потому, что на практике алгоритмы меньше нужны или достаточно стандартных
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Re[2]: std::includes и vector<string>
От: D14  
Дата: 08.09.09 10:58
Оценка:
Здравствуйте, remark, Вы писали:

R>Здравствуйте, igna, Вы писали:


I>>Алгоритм std::includes занимается ерундой выполняя две операции сравнения (x < y и y < x) там где достаточно одной (compare(x, y)):


R>Издержки обобщения...


Скорее, отсутствие в языке и библиотеке концептов.
Re[6]: std::includes и vector<string>
От: igna Россия  
Дата: 08.09.09 11:55
Оценка:
Здравствуйте, AndrewJD, Вы писали:

AJD>Наверное это потому, что на практике алгоритмы меньше нужны или достаточно стандартных


Возможно. Но вроде Степанов хотел создать библиотеку в первую очередь именно алгоритмов, а похоже, что как раз контейнеры используют все программисты (кроме тех, кто вообще не использует STL), а алгоритмы нет.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.