Re[26]: есть ли средства от громоздкой проверки конечной позиции std-итератора
От: _hum_ Беларусь  
Дата: 29.07.16 18:14
Оценка: -1 :)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

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


__>>но в этом случае вариант B0FEE664 все-таки красивее (более целостный и астрактный)


EP>Так там тот же самый value_type, который pair в случае std::map


но в нем соблюден баланс — если уж уровень специализации функции поиска не намеревается спускаться ниже обнаружения value_type, то не имеет смысла вводить еще и указатель на value_type (или optional). достаточно ограничиться итераторами.
Re: есть ли средства от громоздкой проверки конечной позиции std-итератора?
От: B0FEE664  
Дата: 28.07.16 15:03
Оценка: 1 (1)
Здравствуйте, _hum_, Вы писали:

__>ну, честное слово, ну, задолбало уже писать:

  Скрытый текст
__>
__>const auto it = MyVerySpecialFoosMap.find();

__>if(it != MyVerySpecialFoosMap)
__>{
__>  <...>
__>};
__>

__>с дубляжом идентификатора контейнера (который обычно немаленький, а потому смотрится громоздким). ведь так и просится

__>
__>if(!it.is_at_the_end())
__>{
__>  <...>
__>};
__>

И тут я понял, зачем С++17:
auto Find(const auto& oWhere, const auto& rWhat)
{
    return {oWhere.find(rWhat), oWhere.end()};
}

int main()
{
    std::map<std::string, int> oMap = { {"a", 1}, {"b", 2} };
    
    if ( const auto [it, itEnd] = Find(oMap, "a")); it != itEnd )
    {
    
    }
    return 0;
}

И каждый день — без права на ошибку...
есть ли средства от громоздкой проверки конечной позиции std-итератора?
От: _hum_ Беларусь  
Дата: 28.07.16 11:28
Оценка: +1
ну, честное слово, ну, задолбало уже писать:
const auto it = MyVerySpecialFoosMap.find();

if(it != MyVerySpecialFoosMap)
{
  <...>
};

с дубляжом идентификатора контейнера (который обычно немаленький, а потому смотрится громоздким). ведь так и просится

if(!it.is_at_the_end())
{
  <...>
};
Re[5]: есть ли средства от громоздкой проверки конечной позиции std-итератора?
От: Evgeny.Panasyuk Россия  
Дата: 28.07.16 12:36
Оценка: +1
Здравствуйте, _hum_, Вы писали:

EP>>Вместо optional можешь использовать обычный указатель, либо второй вариант с замыканием.

__>ну, все равно придется писать случаи для констатного и неконстантного указателя.

Не придётся, оно получится всё автоматом.

__>в общем, все равно неудобно


Что конкретно неудобно?
Re[7]: есть ли средства от громоздкой проверки конечной позиции std-итератора?
От: Evgeny.Panasyuk Россия  
Дата: 28.07.16 12:52
Оценка: :)
Здравствуйте, _hum_, Вы писали:

__>>>в общем, все равно неудобно

EP>>Что конкретно неудобно?
__>что приходится писать свои функции,

Так ты её напишешь один раз, можешь даже в библиотеку какую-нибудь отослать.
Впрочем я тебя понял — тебе лишь бы к чему-нибудь придраться. Если у тебя предвзято-негативное отношение к C++ — переходи на другой язык, в чём проблема-то?

__>да еще и на каждый контейнер


Почему на каждый?
Re[2]: есть ли средства от громоздкой проверки конечной позиции std-итератора?
От: Evgeny.Panasyuk Россия  
Дата: 29.07.16 10:42
Оценка: :)
Здравствуйте, rm822, Вы писали:

R>2) использовать visual assist, т.к. он сразу подсказывает имя контейнера, причем именно того с которого был взят исходный итератор

R> подозреваю что IntelliSense тоже
R>3) использовать code snippets

Использовать решения на стороне редактора — самые топорные варианты, и трудноподдерживаемые. К ним следует прибегать только когда другие пути отсутствуют, либо труднодоступны.
Здесь же лучше всего написать простую функцию-обёртку с требуемым интерфейсом.
Re[17]: есть ли средства от громоздкой проверки конечной позиции std-итератора
От: Evgeny.Panasyuk Россия  
Дата: 29.07.16 13:16
Оценка: +1
Здравствуйте, _hum_, Вы писали:

__>>>да, все так, но речь шла про простой выход из положения,

EP>>Несколько маленьких функций — это и есть выход из положения.
__>ну, каких несколько, если уже Кодт выше писал:
К>>Это будет не одна функция, а большое семейство.
К>>Для разных контейнеров.
К>>Для диапазонов прямых и обратных.
К>>Для поиска значений и предикатов.

Это всё укладывается в несколько десятков строк. А например обратные диапазоны реализуются ортогонально — смотри boost::adaptors::reversed

__>это если вы видите, что языком не схвачены некоторые понятия, и вы для оперирования с ними пишете библиотеку — тогда, да, победа. а если вам приходится писать только из-за того, что язык не предоставляет нужных средств для оперирования уже существующими в нем концептами, то это совсем другое дело.


Базис есть, на основе этого базиса можешь строить что угодно. А вот полный набор средств для любого возможного оперирования над существующими концепциями — невозможен априори. Одних только алгоритмов для диапазонов — тысячи широко используемых.
В общем ты уже не знаешь до чего докопаться, всё мимо

__>вот введут с++17, тогда проблема частично снимется, потому как можно будет использовать подход B0FEE664 (он намного проще и лаконичнее, чем написание библиотек)


Опять мимо — вообще-то у него тоже пишется отдельная функция
Re: есть ли средства от громоздкой проверки конечной позиц
От: Evgeny.Panasyuk Россия  
Дата: 28.07.16 11:42
Оценка:
Здравствуйте, _hum_, Вы писали:

__>с дубляжом идентификатора контейнера (который обычно немаленький, а потому смотрится громоздким). ведь так и просится

__>
__>if(!it.is_at_the_end())
__>{
__>  <...>
__>};
__>


Итератор может быть легковесным, и не знать где конец. Поэтому одного итератора недостаточно.
Можешь сделать простую функцию-обёртку, возвращающую optional, тогда можно писать так:
if(auto x = find_value(some_map, value))
{
}

Либо как вариант:
find_value(some_map, value, [](auto &x)
{
});
Отредактировано 28.07.2016 11:44 Evgeny.Panasyuk . Предыдущая версия .
Re[2]: есть ли средства от громоздкой проверки конечной позиции std-итератора?
От: _hum_ Беларусь  
Дата: 28.07.16 11:57
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

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


EP>Итератор может быть легковесным, и не знать где конец. Поэтому одного итератора недостаточно.


ладно, наверное, соглашусь. спасибо.

EP>Можешь сделать простую функцию-обёртку, возвращающую optional, тогда можно писать так:

EP>
EP>if(auto x = find_value(some_map, value))
EP>{
EP>}
EP>

да уж простую (еще и optional приплетать и разруливать возврат по ссылки и по значению)
Re[3]: есть ли средства от громоздкой проверки конечной позиции std-итератора?
От: Evgeny.Panasyuk Россия  
Дата: 28.07.16 12:09
Оценка:
Здравствуйте, _hum_, Вы писали:

EP>>Итератор может быть легковесным, и не знать где конец. Поэтому одного итератора недостаточно.

__>ладно, наверное, соглашусь.

А почему наверное? Например у std::vector итератором может быть обычный указатель — он не знает где конец

EP>>Можешь сделать простую функцию-обёртку, возвращающую optional, тогда можно писать так:

EP>>
EP>>if(auto x = find_value(some_map, value))
EP>>{
EP>>}
EP>>

__>да уж простую (еще и optional приплетать и разруливать возврат по ссылки и по значению)

Вместо optional можешь использовать обычный указатель, либо второй вариант с замыканием.
Re[4]: есть ли средства от громоздкой проверки конечной позиции std-итератора?
От: _hum_ Беларусь  
Дата: 28.07.16 12:25
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

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


EP>>>Итератор может быть легковесным, и не знать где конец. Поэтому одного итератора недостаточно.

__>>ладно, наверное, соглашусь.

EP>А почему наверное? Например у std::vector итератором может быть обычный указатель — он не знает где конец


потому что сразу не очевидно, что недостающую информацию нельзя передать на этапе компиляции..

EP>>>Можешь сделать простую функцию-обёртку, возвращающую optional, тогда можно писать так:

EP>>>
EP>>>if(auto x = find_value(some_map, value))
EP>>>{
EP>>>}
EP>>>

__>>да уж простую (еще и optional приплетать и разруливать возврат по ссылки и по значению)

EP>Вместо optional можешь использовать обычный указатель, либо второй вариант с замыканием.


ну, все равно придется писать случаи для констатного и неконстантного указателя. в общем, все равно неудобно
Re[6]: есть ли средства от громоздкой проверки конечной позиции std-итератора?
От: _hum_ Беларусь  
Дата: 28.07.16 12:46
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

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


EP>>>Вместо optional можешь использовать обычный указатель, либо второй вариант с замыканием.

__>>ну, все равно придется писать случаи для констатного и неконстантного указателя.

EP>Не придётся, оно получится всё автоматом.


__>>в общем, все равно неудобно


EP>Что конкретно неудобно?


что приходится писать свои функции, да еще и на каждый контейнер
Re[8]: есть ли средства от громоздкой проверки конечной позиции std-итератора?
От: _hum_ Беларусь  
Дата: 28.07.16 13:08
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

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


__>>>>в общем, все равно неудобно

EP>>>Что конкретно неудобно?
__>>что приходится писать свои функции,

EP>Так ты её напишешь один раз, можешь даже в библиотеку какую-нибудь отослать.

EP>Впрочем я тебя понял — тебе лишь бы к чему-нибудь придраться. Если у тебя предвзято-негативное отношение к C++ — переходи на другой язык, в чём проблема-то?
почти как "не нравится, сделай лучше" я спрашивал, почему с с++ не сделано так, как удобнее, вы ответили. все, я понял суть проблемы, и это немного сняло недовольство. спасибо.

__>>да еще и на каждый контейнер


EP>Почему на каждый?


потому что в мапе поиск ведется по ключам, запакованным в пары, а, например, в векторе, по значениям, из-за чего функция сравнения будет разной.
Re[9]: есть ли средства от громоздкой проверки конечной позиции std-итератора?
От: SaZ  
Дата: 28.07.16 14:53
Оценка:
Здравствуйте, _hum_, Вы писали:

__>почти как "не нравится, сделай лучше" я спрашивал, почему с с++ не сделано так, как удобнее, вы ответили. все, я понял суть проблемы, и это немного сняло недовольство. спасибо.


С чего вы взяли, что можно сделать удобнее? Какие критерии удобства?

__>>>да еще и на каждый контейнер

EP>>Почему на каждый?
__>потому что в мапе поиск ведется по ключам, запакованным в пары, а, например, в векторе, по значениям, из-за чего функция сравнения будет разной.

Поиск ведётся по ключу. Мапа — это дерево. Почитайте хотя-бы основы по структурам данных. Пригодится и не только в С++, это базовые вещи для программиста. А ещё есть такая замечательная штука, как шаблоны.
Re[10]: есть ли средства от громоздкой проверки конечной позиции std-итератора
От: _hum_ Беларусь  
Дата: 28.07.16 15:09
Оценка:
Здравствуйте, SaZ, Вы писали:

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


__>>почти как "не нравится, сделай лучше" я спрашивал, почему с с++ не сделано так, как удобнее, вы ответили. все, я понял суть проблемы, и это немного сняло недовольство. спасибо.


SaZ>С чего вы взяли, что можно сделать удобнее? Какие критерии удобства?


я же привел момент неудобства — необходимо два раза писать идентификатор контейнера — один раз при вызове функции поиска, второй раз при проверке результативности поиска.

__>>>>да еще и на каждый контейнер

EP>>>Почему на каждый?
__>>потому что в мапе поиск ведется по ключам, запакованным в пары, а, например, в векторе, по значениям, из-за чего функция сравнения будет разной.

SaZ>Поиск ведётся по ключу. Мапа — это дерево. Почитайте хотя-бы основы по структурам данных. Пригодится и не только в С++, это базовые вещи для программиста. А ещё есть такая замечательная штука, как шаблоны.


в нашем же разговоре речь шла про написание универсальной (применимой к любому stl-контейнеру) функции.
Re[2]: есть ли средства от громоздкой проверки конечной позиции std-итератора?
От: _hum_ Беларусь  
Дата: 28.07.16 15:21
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>И тут я понял, зачем С++17:

BFE>
[cut=code]
BFE>auto Find(const auto& oWhere, const auto& rWhat)
BFE>{
BFE>    return {oWhere.find(rWhat), oWhere.end()};
BFE>}

BFE>int main()
BFE>{
BFE>    std::map<std::string, int> oMap = { {"a", 1}, {"b", 2} };
    
BFE>    if ( const auto [it, itEnd] = Find(oMap, "a")); it != itEnd )
BFE>    {
    
BFE>    }
BFE>    return 0;
BFE>}
BFE>

[/cut]
BFE>

кстати, интересный вариант
Re: есть ли средства от громоздкой проверки конечной позиции std-итератора?
От: rm822 Россия  
Дата: 29.07.16 10:31
Оценка:
есть 3 очевидных решения
1)
 const auto& c = myVeryLongContainerName;
 auto it = c.find(...)
 if (it != c.end())
 {
  ...
 }

2) использовать visual assist, т.к. он сразу подсказывает имя контейнера, причем именно того с которого был взят исходный итератор
подозреваю что IntelliSense тоже

3) использовать code snippets
Re[11]: есть ли средства от громоздкой проверки конечной позиции std-итератора
От: Кодт Россия  
Дата: 29.07.16 11:06
Оценка:
Здравствуйте, _hum_, Вы писали:

__>в нашем же разговоре речь шла про написание универсальной (применимой к любому stl-контейнеру) функции.


Это будет не одна функция, а большое семейство.
Для разных контейнеров.
Для диапазонов прямых и обратных.
Для поиска значений и предикатов.

Кстати, вместо optional или пары (найдено, конец) проще всего возвращать голый указатель.
template<class I>
auto ptr_from_iter(I i, I e) { return i == e ? nullptr : &*i; }

template<class I, class V>
auto find_from_to(I b, I e, V&& v) { return ptr_from_iter(std::find(b, e, v), e); }

// для контейнеров, у которых есть член find
template<class C, class V>
auto find_in(C&& c, V&& v) { return ptr_from_iter(c.find(v), end(c)); }

// для контейнеров, у которых find внешний
template<class C, class V>
auto find_over(C&& c, V&& v) { return find_from_to(begin(c), end(c), v); }

int main() {
  std::map<int,string> the_map = { {1,"hello"} };
  std::vector<int> the_vec = {3,5,1};

  for (int i=0; i<2; ++i) {
    std::cout << "looking for " << i << ":" << std::endl;
    if(auto p = find_in(the_map, i)) {
      std::cout << p->first << ":" << p->second << std::endl;
    } else {
      std::cout << "not found" << std::endl;
    }

    if(auto p = find_over(the_vec, i)) {
      std::cout << *p << std::endl;
    } else {
      std::cout << "not found" << std::endl;
    }
  }
}
Перекуём баги на фичи!
Re[12]: есть ли средства от громоздкой проверки конечной позиции std-итератора
От: _hum_ Беларусь  
Дата: 29.07.16 11:31
Оценка:
Здравствуйте, Кодт, Вы писали:

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


__>>в нашем же разговоре речь шла про написание универсальной (применимой к любому stl-контейнеру) функции.


К>Это будет не одна функция, а большое семейство.

К>Для разных контейнеров.
К>Для диапазонов прямых и обратных.
К>Для поиска значений и предикатов.

я об этом и сказал выше — что одной универсальной не получится
Re[2]: есть ли средства от громоздкой проверки конечной позиции std-итератора?
От: _hum_ Беларусь  
Дата: 29.07.16 11:34
Оценка:
Здравствуйте, rm822, Вы писали:

R>есть 3 очевидных решения

R>1)
R>
R> const auto& c = myVeryLongContainerName;
R> auto it = c.find(...)
R> if (it != c.end())
R> {
R>  ...
R> }
R>

не пойдет, так как вводится новый идентификатор "с", что замусоривает как текст, так и семантику кода.
Re[13]: есть ли средства от громоздкой проверки конечной п
От: Evgeny.Panasyuk Россия  
Дата: 29.07.16 11:50
Оценка:
Здравствуйте, _hum_, Вы писали:

__>я об этом и сказал выше — что одной универсальной не получится


Имя может быть одно, например через перегрузку (UPD: хотя в этом случае тут семантика разная, это не просто оптимизация).
А вот реализация разная, потому что это контейнеры разных концепций. Точнее ты можешь сделать одну универсальную реализацию, но это будет неэффективно.
Точно также как и в случае с std::advance — универсальная реализация линейная, но есть более оптимальная для более узкой категории итераторов. Другой пример — std::partition
Отредактировано 29.07.2016 19:22 Evgeny.Panasyuk . Предыдущая версия .
Re[14]: есть ли средства от громоздкой проверки конечной позиции std-итератора
От: _hum_ Беларусь  
Дата: 29.07.16 12:03
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

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


__>>я об этом и сказал выше — что одной универсальной не получится


EP>Имя может быть одно, например через перегрузку.

EP>А вот реализация разная, потому что это контейнеры разных концепций. Точнее ты можешь сделать одну универсальную реализацию, но это будет неэффективно.
EP>Точно также как и в случае с std::advance — универсальная реализация линейная, но есть более оптимальная для более узкой категории итераторов. Другой пример — std::partition

да, все так, но речь шла про простой выход из положения,а не про написание собственной библиотеки
Re[15]: есть ли средства от громоздкой проверки конечной позиции std-итератора
От: Evgeny.Panasyuk Россия  
Дата: 29.07.16 12:23
Оценка:
Здравствуйте, _hum_, Вы писали:

__>да, все так, но речь шла про простой выход из положения,


Несколько маленьких функций — это и есть выход из положения.

__>а не про написание собственной библиотеки


Вообще говоря, при написании любого приложения, на любом языке, постоянно возникают вот такие вот такие утилитарные generic функции, алгоритмы и т.п., которые потом и сливаются в библиотеку.
Твой настрой "мне что ещё и библиотеку писать" — в корне не верный. Такие функции наоборот, это как бонус в игре — от предметной области не зависят, очень легко тестируются, помогают разгрузить код уровня приложения и т.п. — и если удаётся часто повторяющийся синтаксический орнамент вынести в такую библиотеку — то это локальная победа.

http://www.stepanovpapers.com/notes.pdf
The result of my experiment was quite astonishing. The code did not contain serious bugs. There were typos: I had to change AND to OR, etc. But I did no
t need patches. And over 95% of the code was in general functions! I felt quite proud. There remained a problem that I could not yet precisely figure out what it meant that a function was general. As a matter of fact, it is possible to summarize my research over the next 30 years as an attempt to clarify this very point.

It is easy to overlook the importance of what I discovered. I did not discover that general functions could be used by other programmers. As a matter of fact, I did not think of other programmers. I did not even discover that I could use them later. The significant thing was that making interfaces general – even if I did not quite know what it meant – I made them much more robust. The changes in the surrounding code or changes in the grammar of the input language did not affect the general functions: 95% of the code was impervious to change. In other words: decomposing an application into a collection of general purpose algorithms and data structures makes it robust. (But even without generality, code is much more robust when it is decomposed into small functions with clean interfaces.) Later on, I discovered the following fact: as the size of application grows so does the percentage of the general code. I believe, for example, that in most modern desktop applications the non-general code should be well under 1%.

Re[16]: есть ли средства от громоздкой проверки конечной позиции std-итератора
От: _hum_ Беларусь  
Дата: 29.07.16 13:05
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

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


__>>да, все так, но речь шла про простой выход из положения,


EP>Несколько маленьких функций — это и есть выход из положения.


ну, каких несколько, если уже Кодт выше писал:
К>Это будет не одна функция, а большое семейство.
К>Для разных контейнеров.
К>Для диапазонов прямых и обратных.
К>Для поиска значений и предикатов.

__>>а не про написание собственной библиотеки


EP>Вообще говоря, при написании любого приложения, на любом языке, постоянно возникают вот такие вот такие утилитарные generic функции, алгоритмы и т.п., которые потом и сливаются в библиотеку.

EP>Твой настрой "мне что ещё и библиотеку писать" — в корне не верный. Такие функции наоборот, это как бонус в игре — от предметной области не зависят, очень легко тестируются, помогают разгрузить код уровня приложения и т.п. — и если удаётся часто повторяющийся синтаксический орнамент вынести в такую библиотеку — то это локальная победа.
  quote
EP>

EP>http://www.stepanovpapers.com/notes.pdf
EP>The result of my experiment was quite astonishing. The code did not contain serious bugs. There were typos: I had to change AND to OR, etc. But I did no
EP>t need patches. And over 95% of the code was in general functions! I felt quite proud. There remained a problem that I could not yet precisely figure out what it meant that a function was general. As a matter of fact, it is possible to summarize my research over the next 30 years as an attempt to clarify this very point.

EP>It is easy to overlook the importance of what I discovered. I did not discover that general functions could be used by other programmers. As a matter of fact, I did not think of other programmers. I did not even discover that I could use them later. The significant thing was that making interfaces general – even if I did not quite know what it meant – I made them much more robust. The changes in the surrounding code or changes in the grammar of the input language did not affect the general functions: 95% of the code was impervious to change. In other words: decomposing an application into a collection of general purpose algorithms and data structures makes it robust. (But even without generality, code is much more robust when it is decomposed into small functions with clean interfaces.) Later on, I discovered the following fact: as the size of application grows so does the percentage of the general code. I believe, for example, that in most modern desktop applications the non-general code should be well under 1%.


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

вот введут с++17, тогда проблема частично снимется, потому как можно будет использовать подход B0FEE664 (он намного проще и лаконичнее, чем написание библиотек)
Re[18]: есть ли средства от громоздкой проверки конечной позиции std-итератора
От: _hum_ Беларусь  
Дата: 29.07.16 13:57
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

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


__>>>>да, все так, но речь шла про простой выход из положения,

EP>>>Несколько маленьких функций — это и есть выход из положения.
__>>ну, каких несколько, если уже Кодт выше писал:
К>>>Это будет не одна функция, а большое семейство.
К>>>Для разных контейнеров.
К>>>Для диапазонов прямых и обратных.
К>>>Для поиска значений и предикатов.

EP>Это всё укладывается в несколько десятков строк. А например обратные диапазоны реализуются ортогонально — смотри boost::adaptors::reversed


то есть, мне еще и диапазоны реализовывать, или притаскивать буст

__>>это если вы видите, что языком не схвачены некоторые понятия, и вы для оперирования с ними пишете библиотеку — тогда, да, победа. а если вам приходится писать только из-за того, что язык не предоставляет нужных средств для оперирования уже существующими в нем концептами, то это совсем другое дело.


EP>Базис есть, на основе этого базиса можешь строить что угодно. А вот полный набор средств для любого возможного оперирования над существующими концепциями — невозможен априори. Одних только алгоритмов для диапазонов — тысячи широко используемых.

EP>В общем ты уже не знаешь до чего докопаться, всё мимо

речь о не обо всех, а о принципиальных для манипуляции концептами (одно дело, когда в языке нет комплексных чисел, и ты пишешь библиотеку, и совсем другое, когда в языке есть, например, вещественные числа, но нет удобного средства для поиска частного двух таких чисел, и приходится самому писать эту функцию — чувствуете разницу?)

__>>вот введут с++17, тогда проблема частично снимется, потому как можно будет использовать подход B0FEE664 (он намного проще и лаконичнее, чем написание библиотек)


EP>Опять мимо — вообще-то у него тоже пишется отдельная функция


одна максимально(почти) общая простейшая функция вместо библиотеки
Re[19]: есть ли средства от громоздкой проверки конечной позиции std-итератора
От: Evgeny.Panasyuk Россия  
Дата: 29.07.16 14:11
Оценка:
Здравствуйте, _hum_, Вы писали:

EP>>Это всё укладывается в несколько десятков строк. А например обратные диапазоны реализуются ортогонально — смотри boost::adaptors::reversed

__>то есть, мне еще и диапазоны реализовывать,

Уже всё реализовано в Boost.Range.

__>или притаскивать буст


Прям целый букет:
— "притаскивать буст"
— auto "редкоприменим"
— ещё ЕМНИП у тебя было что-то на тему exception-фобии

EP>>Базис есть, на основе этого базиса можешь строить что угодно. А вот полный набор средств для любого возможного оперирования над существующими концепциями — невозможен априори. Одних только алгоритмов для диапазонов — тысячи широко используемых.

EP>>В общем ты уже не знаешь до чего докопаться, всё мимо
__>речь о не обо всех, а о принципиальных для манипуляции концептами (одно дело, когда в языке нет комплексных чисел, и ты пишешь библиотеку, и совсем другое, когда в языке есть, например, вещественные числа, но нет удобного средства для поиска частного двух таких чисел, и приходится самому писать эту функцию — чувствуете разницу?)

Это было бы так, если не было бы логарифмического поиска в map, или например splice для списков и т.п. — но это всё есть.

__>>>вот введут с++17, тогда проблема частично снимется, потому как можно будет использовать подход B0FEE664 (он намного проще и лаконичнее, чем написание библиотек)

EP>>Опять мимо — вообще-то у него тоже пишется отдельная функция
__>одна максимально(почти) общая простейшая функция вместо библиотеки

И опять мимо Я тебя сразу сказал что достаточно простой функции обёртки. Несколько нужно для работы с разными концепциями контейнеров, и в случае как ты говоришь "подхода B0FEE664" — там также будет несколько функций
Re[20]: есть ли средства от громоздкой проверки конечной позиции std-итератора
От: _hum_ Беларусь  
Дата: 29.07.16 14:35
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:


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


__>>или притаскивать буст


EP>Прям целый букет:

EP>- "притаскивать буст"
EP>- auto "редкоприменим"
EP>- ещё ЕМНИП у тебя было что-то на тему exception-фобии

ага все проистекает из "люблю простоту и максимальный контроль"

EP>>>Базис есть, на основе этого базиса можешь строить что угодно. А вот полный набор средств для любого возможного оперирования над существующими концепциями — невозможен априори. Одних только алгоритмов для диапазонов — тысячи широко используемых.

EP>>>В общем ты уже не знаешь до чего докопаться, всё мимо
__>>речь о не обо всех, а о принципиальных для манипуляции концептами (одно дело, когда в языке нет комплексных чисел, и ты пишешь библиотеку, и совсем другое, когда в языке есть, например, вещественные числа, но нет удобного средства для поиска частного двух таких чисел, и приходится самому писать эту функцию — чувствуете разницу?)

EP>Это было бы так, если не было бы логарифмического поиска в map, или например splice для списков и т.п. — но это всё есть.


нет простой работы с поиском (все выглядит довольно громоздко)[раньше и с итерированием были проблемы, но с с++11 они почти решились]

__>>>>вот введут с++17, тогда проблема частично снимется, потому как можно будет использовать подход B0FEE664 (он намного проще и лаконичнее, чем написание библиотек)

EP>>>Опять мимо — вообще-то у него тоже пишется отдельная функция
__>>одна максимально(почти) общая простейшая функция вместо библиотеки

EP>И опять мимо Я тебя сразу сказал что достаточно простой функции обёртки. Несколько нужно для работы с разными концепциями контейнеров, и в случае как ты говоришь "подхода B0FEE664" — там также будет несколько функций


да, нужно две, одна
auto Find(const auto& oWhere, const auto& rWhat)
{
    return {oWhere.find(rWhat), oWhere.end()};
}

а вторая (для не имеющих специализированного метода find)
auto Find(const auto& oWhere, const auto& rWhat)
{
    return {std::find(oWhere.begin(), oWhere.end(), rWhat), oWhere.end()};
}


в вашем же предложении (когда предлагалось возвращать указатели на найденные элементы) так не получится — для map и для set придется писать отдельные функции [ну, либо я не понял вашей задумки]
Re[21]: есть ли средства от громоздкой проверки конечной позиции std-итератора
От: Evgeny.Panasyuk Россия  
Дата: 29.07.16 15:33
Оценка:
Здравствуйте, _hum_, Вы писали:

EP>>Это было бы так, если не было бы логарифмического поиска в map, или например splice для списков и т.п. — но это всё есть.

__>нет простой работы с поиском (все выглядит довольно громоздко)

operator[] у std::map/unordered_map — для типовых ситуаций даёт использование даже проще чем в Python.

EP>>И опять мимо Я тебя сразу сказал что достаточно простой функции обёртки. Несколько нужно для работы с разными концепциями контейнеров, и в случае как ты говоришь "подхода B0FEE664" — там также будет несколько функций

__>да, нужно две, одна
__>...
__>в вашем же предложении (когда предлагалось возвращать указатели на найденные элементы) так не получится — для map и для set придется писать отдельные функции [ну, либо я не понял вашей задумки]

Не придётся
auto find_value(auto &&m, const auto &x)
{
    auto p = m.find(x);
    return p == end(m) ? nullptr : &*p;
}
Re[22]: есть ли средства от громоздкой проверки конечной позиции std-итератора
От: _hum_ Беларусь  
Дата: 29.07.16 15:54
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

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


EP>>>Это было бы так, если не было бы логарифмического поиска в map, или например splice для списков и т.п. — но это всё есть.

__>>нет простой работы с поиском (все выглядит довольно громоздко)

EP>operator[] у std::map/unordered_map — для типовых ситуаций даёт использование даже проще чем в Python.


это не чистый поиск (если элемента нет, он автоматически будет вставлен). к тому же операция не является const-операцией (а значит, ее не всюду можно вызвать).

EP>>>И опять мимо Я тебя сразу сказал что достаточно простой функции обёртки. Несколько нужно для работы с разными концепциями контейнеров, и в случае как ты говоришь "подхода B0FEE664" — там также будет несколько функций

__>>да, нужно две, одна
__>>...
__>>в вашем же предложении (когда предлагалось возвращать указатели на найденные элементы) так не получится — для map и для set придется писать отдельные функции [ну, либо я не понял вашей задумки]

EP>Не придётся

EP>
EP>auto find_value(auto &&m, const auto &x)
EP>{
EP>    auto p = m.find(x);
EP>    return p == end(m) ? nullptr : &*p;
EP>}
EP>


ну так, для мапа она вернет указатель на пару <ключ, значение> вместо обещанного указателя на значение
Re[23]: есть ли средства от громоздкой проверки конечной позиции std-итератора
От: Evgeny.Panasyuk Россия  
Дата: 29.07.16 16:11
Оценка:
Здравствуйте, _hum_, Вы писали:

EP>>>>Это было бы так, если не было бы логарифмического поиска в map, или например splice для списков и т.п. — но это всё есть.

__>>>нет простой работы с поиском (все выглядит довольно громоздко)
EP>>operator[] у std::map/unordered_map — для типовых ситуаций даёт использование даже проще чем в Python.
__>это не чистый поиск (если элемента нет, он автоматически будет вставлен).

Так я же и говорю это типовая операция — например посчитать какую-нибудь гистограмму: ++m[key];

EP>>Не придётся

EP>>
EP>>auto find_value(auto &&m, const auto &x)
EP>>{
EP>>    auto p = m.find(x);
EP>>    return p == end(m) ? nullptr : &*p;
EP>>}
EP>>

__>ну так, для мапа она вернет указатель на пару <ключ, значение> вместо обещанного указателя на значение

1. В обоих случаях будет указатель на value_type.
2. Аналогичная ситуация и в "подходе B0FEE664" — там только итератор не разыменован — поэтому суть претензии не ясна
Re[24]: есть ли средства от громоздкой проверки конечной позиции std-итератора
От: _hum_ Беларусь  
Дата: 29.07.16 16:42
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

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


EP>>>>>Это было бы так, если не было бы логарифмического поиска в map, или например splice для списков и т.п. — но это всё есть.

__>>>>нет простой работы с поиском (все выглядит довольно громоздко)
EP>>>operator[] у std::map/unordered_map — для типовых ситуаций даёт использование даже проще чем в Python.
__>>это не чистый поиск (если элемента нет, он автоматически будет вставлен).

EP>Так я же и говорю это типовая операция — например посчитать какую-нибудь гистограмму: ++m[key];


типичная для построения мапа, а не для работы с уже построенным.

EP>>>Не придётся

EP>>>
EP>>>auto find_value(auto &&m, const auto &x)
EP>>>{
EP>>>    auto p = m.find(x);
EP>>>    return p == end(m) ? nullptr : &*p;
EP>>>}
EP>>>

__>>ну так, для мапа она вернет указатель на пару <ключ, значение> вместо обещанного указателя на значение

EP>1. В обоих случаях будет указатель на value_type.

EP>2. Аналогичная ситуация и в "подходе B0FEE664" — там только итератор не разыменован — поэтому суть претензии не ясна

то есть, в самом первом своем сообщении
EP>Можешь сделать простую функцию-обёртку, возвращающую optional, тогда можно писать так:
EP>
EP>if(auto x = find_value(some_map, value))
EP>{
EP>}
EP>

вы под optional имели в виду именно <ключ, значение>, а не само значение? ну тогда, извиняюсь, я вас неправильно понимал.
но в этом случае вариант B0FEE664 все-таки красивее (более целостный и астрактный)
Re[25]: есть ли средства от громоздкой проверки конечной позиции std-итератора
От: Evgeny.Panasyuk Россия  
Дата: 29.07.16 16:51
Оценка:
Здравствуйте, _hum_, Вы писали:

EP>>1. В обоих случаях будет указатель на value_type.

EP>>2. Аналогичная ситуация и в "подходе B0FEE664" — там только итератор не разыменован — поэтому суть претензии не ясна
__>то есть, в самом первом своем сообщении
EP>>Можешь сделать простую функцию-обёртку, возвращающую optional, тогда можно писать так:
EP>>
EP>>if(auto x = find_value(some_map, value))
EP>>{
EP>>}
EP>>

__>вы под optional имели в виду именно <ключ, значение>, а не само значение? ну тогда, извиняюсь, я вас неправильно понимал.

Всё равно. Как тебе удобней так и реализуй, я не знаю какие у тебя потребности.

__>но в этом случае вариант B0FEE664 все-таки красивее (более целостный и астрактный)


Так там тот же самый value_type, который pair в случае std::map
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.