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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> fusion::set - никакой ни set! 
V
    Опции темы
boostcoder
Дата 5.8.2011, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



всем привет.
то ли я не могу понять профита этого контейнера, то ли второе...

код:
Код

#include <boost/fusion/container/set.hpp>
#include <boost/fusion/include/set.hpp>
#include <boost/fusion/container/set/set_fwd.hpp>
#include <boost/fusion/include/set_fwd.hpp>

#include <boost/fusion/sequence/intrinsic/has_key.hpp>
#include <boost/fusion/include/has_key.hpp>
#include <boost/fusion/sequence/intrinsic/size.hpp>
#include <boost/fusion/include/size.hpp>

#include <iostream>

int main() {
   typedef boost::fusion::set<int, int> set1;
   set1 s1;
   
   std::cout
   << "size1 = " << boost::fusion::result_of::size<set1>::type::value
   << ", size2 = " << boost::fusion::size(s1)
   << std::endl;
}

http://liveworkspace.org/code/4264c75047f9...fae39a7f9a3704c

согласно доке, для каждого ключа может существовать только одно значение. это правильно.
но почему при двух одинаковых ключах, размер множества == 2 ?! должен быть 1.
в общем, вопрос в том, как сделать так, чтоб множество стало множеством?

спасибо.

Добавлено через 6 минут и 11 секунд
c map тоже самое smile 

Код

#include <boost/fusion/container/set.hpp>
#include <boost/fusion/include/set.hpp>
#include <boost/fusion/container/set/set_fwd.hpp>
#include <boost/fusion/include/set_fwd.hpp>
#include <boost/fusion/container/map.hpp>
#include <boost/fusion/include/map.hpp>
#include <boost/fusion/container/map/map_fwd.hpp>
#include <boost/fusion/include/map_fwd.hpp>
#include <boost/fusion/support/pair.hpp>
#include <boost/fusion/include/pair.hpp>
#include <boost/fusion/sequence/intrinsic/has_key.hpp>
#include <boost/fusion/include/has_key.hpp>
#include <boost/fusion/sequence/intrinsic/size.hpp>
#include <boost/fusion/include/size.hpp>

#include <iostream>

int main() {
   using namespace boost::fusion;
   
   typedef set<int, int> set1;
   set1 s1;
   
   typedef map<
      pair<char, int>,
      pair<char, double>
   > map1;
   map1 m1;
   
   std::cout
   << "set size1 = " << result_of::size<set1>::type::value
   << ", set size2 = " << size(s1)
   << std::endl;

   std::cout
   << "map size1 = " << result_of::size<map1>::type::value
   << ", map size2 = " << size(m1)
   << std::endl;
}



http://liveworkspace.org/code/f8f8113aa470...8fe13e2dddffb1c
PM WWW   Вверх
mes
Дата 5.8.2011, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  5.8.2011,  11:36 Найти цитируемый пост)
 для каждого ключа может существовать только одно значение. это правильно.
но почему при двух одинаковых ключах,

не вижу логики,  где в доке говориться что ключи должны быть уникальны   smile

Добавлено через 1 минуту и 13 секунд
Цитата(boostcoder @  5.8.2011,  11:36 Найти цитируемый пост)
опрос в том, как сделать так, чтоб множество стало множеством?

удалять дубликаты, прежде чем пользоваться smile



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


pattern`щик
****


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

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



Цитата(mes @  5.8.2011,  13:54 Найти цитируемый пост)
где в доке говориться что ключи должны быть уникальны

нигде не говорится. но std::set и std::map так и работают..

Цитата(mes @  5.8.2011,  13:54 Найти цитируемый пост)
удалять дубликаты, прежде чем пользоваться

 smile 
PM WWW   Вверх
serghd
Дата 9.8.2011, 01:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Поскольку ключами являются сами типы, то, возможно, при выдаче размера учитывается как раз именно их количество, а не фактическое кол-во элементов. Т.е.:
Код

#include <boost/fusion/container/set.hpp>
#include <boost/fusion/include/at_key.hpp>
#include <iostream>

int main() 
{
 boost::fusion::set<int, int, char> s(12, 10, 'c');
 std::cout << boost::fusion::at_key<int>(s) << std::endl;
 std::cout << boost::fusion::at_key<int>(s) << std::endl;
 std::cout << "size: " << boost::fusion::size(s);
 std::cout << std::endl;
}

http://liveworkspace.org/code/13a2975e914f...47f4f6d2ea53461

В обоих случаях - 12 (м.б. есть варианты вывода 10-ки(?), в чём сомневаюсь), т.е. фактически правило уникальности сохраняется.

Это сообщение отредактировал(а) serghd - 9.8.2011, 02:01
PM MAIL   Вверх
mes
Дата 9.8.2011, 08:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(serghd @  9.8.2011,  00:40 Найти цитируемый пост)
 т.е. фактически правило уникальности сохраняется.

при for each'e уникальность не "сохранится"


--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 9.8.2011, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(serghd @  9.8.2011,  01:40 Найти цитируемый пост)
т.е. фактически правило уникальности сохраняется.

у map и set уникальными должны быть ключи, а не значения.
PM WWW   Вверх
mes
Дата 9.8.2011, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  9.8.2011,  07:31 Найти цитируемый пост)
у map и set уникальными должны быть ключи, а не значения. 

ну он и привел, когда не смотря на наличие двух ключей, пользуется только один  smile 


--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 9.8.2011, 08:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(mes @  9.8.2011,  08:33 Найти цитируемый пост)
пользуется только один

тогда и размер должен быть соответствующий.
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0646 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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