2014-02-01 3 views
1

Я реализую C++ STL set<>, и у меня возникли проблемы с использованием функции find().find() использование в C++ stl

Ниже представлен мой тип set<>, так что я могу хранить три целых числа a, b, c.

set<pair<int,pair<int,int> > > myset; 

1) Как использовать find() в нем. «Нужно ли мне передать свою собственную функцию компаратора здесь, как и мы в своем роде()».

2) Также как будет set<> сохранить отличимость множества. Я имею в виду, я хочу набор, содержащий

{ {1,2,3}; {2,3,4} ; {2,3,1} } элементы, если я вставляю: -

{1,2,3} 

{2,3,4} 

{1,2,3} 

{2,3,1} 
+0

использовать' STD :: set' в. – juanchopanza

+3

внедрение 'set' или его использование? – Yakk

+0

Я не могу использовать напрямую find(), Its дает Error. :(.. Я думаю, нам нужно передать компаратор в нем ... – CoderBoy

ответ

4

Вы можете использовать кортеж вместо пары < междунар, пара>? (Смотрите в конце ответа)

Если вы не можете (потому что вы не используете C++ 11), использовать поиск с парами, вам не нужны ваши компараторов:

typedef pair<int,pair<int,int>> my_type; 
typedef set<my_type> set_of_mytype; 
set_of_mytype myset; 
myset.insert(make_pair(1,make_pair(3,4))); 


set_of_mytype::iterator search1 = myset.find(make_pair(1,make_pair(5,4))); 
set_of_mytype::iterator search2 = myset.find(make_pair(1,make_pair(3,4))); 


if(search1 != myset.end()) 
    cout << "search 1: (1,(5,4)) found !" << endl; 
if(search2 != myset.end()) 
    cout << "search 2: (1,(3,4)) found !" << endl; 

cout << " Size of the set with only (1,(3,4)) in it : "<< myset.size() << endl; 
myset.insert(make_pair(3,make_pair(1,4))); 
cout << " Size of the set with only (1,(3,4)) and (3,(1,4)) in it : "<< myset.size() << endl; 

Выведет:

поиск 2: (1, (3,4)) найдено!

Размер набора только с (1, (3,4)) в нем: 1

Размер набора только с (1, (3,4)) и (3, (1,4)) в нем: 2

Так что для вашего первого вопроса: без пользовательского компаратора это работает.

Для второго, если вы пытаетесь вставить снова:

myset.insert(make_pair(1,make_pair(3,4))); 
cout << " Size of the set is still : "<< myset.size() << endl; 

Выход

Размер набора по-прежнему: 2

Так что "различимость" будет присутствовать здесь.


Если вы компилируете с C++ 11, которые можно использовать кортежи:

typedef tuple <int,int,int> my_type2; 
typedef set<my_type2> set_of_tuples; 
set_of_tuples myset2; 
myset2.insert(make_tuple(1,3,4)); 

ваш код будет проще: написание make_tuple (1,3,4) проще, чем make_pair (1 , make_pair (3,4)). Plus acessing элемент с этим будет проще: `find` функция член

set_of_tuples::iterator it = my_set.find(make_tuple(1,3,4)) 
my_type2 my_element = *it 
cout << get<0>(my_element) << "," << get<1>(my_element) << "," get<2>(my_element) << endl; 
+0

Точно то, что я искал тогда :). Этот путь, если мне дано много треугольников со своими сторонами (a, b, c). Я могу указать количество различных треугольников. – CoderBoy

Смежные вопросы