Всем привет! Коллеги, объясните пожалуйста по возможности такое поведение:
#include"boost/static_assert.hpp"#include"boost/mpl/map.hpp"#include"boost/mpl/insert.hpp"#include"boost/mpl/size.hpp"namespace mpl = ::boost::mpl;
int main()
{
struct A {};
struct B {};
struct C {};
struct string {};
typedef mpl::map<
mpl::pair< A, int >
, mpl::pair< B, char >
, mpl::pair< C, string >
>
::type m1;
typedef mpl::insert< m1, mpl::pair< A, int > >::type m2;
typedef mpl::insert< m1, mpl::pair< A, double > >::type m3;
BOOST_STATIC_ASSERT( mpl::size< m2 >::value == mpl::size< m1 >::value );
BOOST_STATIC_ASSERT( mpl::size< m3 >::value == mpl::size< m1 >::value + 1 );
}
— почему при вставке имеющейся пары (совпадают оба два элемента) добавления не происходит, а при вставке с другим значением (совпадают только ключи) — происходит? Версия буста 1.49. Спасибо за внимание.
Здравствуйте, Warturtle, Вы писали:
W>Всем привет! Коллеги, объясните пожалуйста по возможности такое поведение: W>... W>- почему при вставке имеющейся пары (совпадают оба два элемента) добавления не происходит, а при вставке с другим значением (совпадают только ключи) — происходит? Версия буста 1.49. Спасибо за внимание.
Оценки — это прекрасно, а по существу вопроса уважаемые господа что скажут? Ну, кроме RTFM — видимо я тупой и не понял чего-то из документации. Так и должно быть или где? А если должно, то почему?
Здравствуйте, Warturtle, Вы писали:
W>Оценки — это прекрасно, а по существу вопроса уважаемые господа что скажут? Ну, кроме RTFM — видимо я тупой и не понял чего-то из документации. Так и должно быть или где? А если должно, то почему?
Попробуй проделать то же самое с std::map, или с питоновским dict, или с перловским hash, и помедитируй над результатом
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, Warturtle, Вы писали:
W>>Оценки — это прекрасно, а по существу вопроса уважаемые господа что скажут? Ну, кроме RTFM — видимо я тупой и не понял чего-то из документации. Так и должно быть или где? А если должно, то почему?
J>Попробуй проделать то же самое с std::map, или с питоновским dict, или с перловским hash, и помедитируй над результатом
Нет я правда не понимаю, что ты имеешь ввиду:
#include <stdio.h>
#include <map>
typedef std::map< int, int > Map;
void Print(Map const & m)
{
for (Map::const_iterator i = m.begin(); i != m.end(); ++i)
::printf("(%d, %d)\n", i->first, i->second);
}
int main()
{
::printf("1.\n");
Map m;
m.insert( std::make_pair(1, 10) );
m.insert( std::make_pair(2, 20) );
m.insert( std::make_pair(3, 30) );
Print(m);
::printf("2.\n");
m.insert( std::make_pair(1, 10) );
Print(m);
::printf("3.\n");
m.insert( std::make_pair(1, 555) );
Print(m);
}
не добавляется и не должен. Мало медитировал или что?
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, Warturtle, Вы писали:
W>>Оценки — это прекрасно, а по существу вопроса уважаемые господа что скажут? Ну, кроме RTFM — видимо я тупой и не понял чего-то из документации. Так и должно быть или где? А если должно, то почему?
J>Попробуй проделать то же самое с std::map, или с питоновским dict, или с перловским hash, и помедитируй над результатом
Может я недостаточно ясно сформулировал вопрос, тогда замечу еще, что в первом сообщении у меня не срабатывают оба ассерта, т.е. программа компилится.
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, Warturtle, Вы писали:
W>>Оценки — это прекрасно, а по существу вопроса уважаемые господа что скажут? Ну, кроме RTFM — видимо я тупой и не понял чего-то из документации. Так и должно быть или где? А если должно, то почему?
J>Попробуй проделать то же самое с std::map, или с питоновским dict, или с перловским hash, и помедитируй над результатом
Что-то я вообще перестал что-либо понимать:
Здравствуйте, Warturtle, Вы писали:
W>Может я недостаточно ясно сформулировал вопрос, тогда замечу еще, что в первом сообщении у меня не срабатывают оба ассерта, т.е. программа компилится.
Вообще-то да, с этого надо было начать.
boost::mpl::map разрешает несколько разных значений для одного ключа.
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, Warturtle, Вы писали:
W>>Может я недостаточно ясно сформулировал вопрос, тогда замечу еще, что в первом сообщении у меня не срабатывают оба ассерта, т.е. программа компилится.
J>Вообще-то да, с этого надо было начать.
J>boost::mpl::map разрешает несколько разных значений для одного ключа.
А как же тогда понимать вот это предложение из описания mpl::map:
A map may contain at most one element for each key.
Здравствуйте, Warturtle, Вы писали:
J>>boost::mpl::map разрешает несколько разных значений для одного ключа. W>А как же тогда понимать вот это предложение из описания mpl::map: W>
W>A map may contain at most one element for each key.
W>?
Лажа.
Там есть ниже, например
count<m,k>::type The number of elements with the key k in m
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, Warturtle, Вы писали:
J>>>boost::mpl::map разрешает несколько разных значений для одного ключа. W>>А как же тогда понимать вот это предложение из описания mpl::map: W>>
W>>A map may contain at most one element for each key.
W>>? J>Лажа. J>Там есть ниже, например J>
J>count<m,k>::type The number of elements with the key k in m
J>ну либо либо лажа в библиотеке J>какие-то баг-репорты на тему вставки в мапу есть, типа вот: https://svn.boost.org/trac/boost/ticket/8749
J>В общем, если нужна уникальность, юзай has_key перед вставкой.
Спасибо, теперь понятно. Вообще-то им стоило бы тогда mpl::map мультимапом назвать, а то какие-то неверные ассоциации возникают. Тем более, что mpl::set ведет себя скорее как std::set, а не мультисет=)
Здравствуйте, Warturtle, Вы писали:
W>Спасибо, теперь понятно. Вообще-то им стоило бы тогда mpl::map мультимапом назвать, а то какие-то неверные ассоциации возникают. Тем более, что mpl::set ведет себя скорее как std::set, а не мультисет=)
Кажется на mpl уже давно все забили в бусте.
Все ожидают новую библиотеку с более говорящим название HANA (ХАНА!).
Здравствуйте, Warturtle, Вы писали:
J>>В общем, если нужна уникальность, юзай has_key перед вставкой.
W>Спасибо, теперь понятно. Вообще-то им стоило бы тогда mpl::map мультимапом назвать, а то какие-то неверные ассоциации возникают. Тем более, что mpl::set ведет себя скорее как std::set, а не мультисет=)
Не, мультимап позволяет полные дубликаты, а этот — нет
Здравствуйте, placement_new, Вы писали:
_>Здравствуйте, Warturtle, Вы писали:
W>>Спасибо, теперь понятно. Вообще-то им стоило бы тогда mpl::map мультимапом назвать, а то какие-то неверные ассоциации возникают. Тем более, что mpl::set ведет себя скорее как std::set, а не мультисет=)
_>Кажется на mpl уже давно все забили в бусте. _>Все ожидают новую библиотеку с более говорящим название HANA (ХАНА!).
Ну хана так хана — посмотрим=) Хотя все-таки немного интересно почему они это так реализовали: изначальный недосмотр+"вообщепоx" или "бай дизайн".