Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.03.2012, 00:09   #1
applegrub
Пользователь
 
Регистрация: 30.10.2011
Сообщений: 22
По умолчанию Контейнер multiset

Доброго времени суток!!!

Подскажите пожалуйста, в чем ошибка моего кода.

Код HTML:
void main() {
              struct B {
                     int a;
	       int b;
	} C;

	multiset<B> A;
	multiset<B>::iterator it;


   it=A.insert(C);  // вот здесь ошибка
}
Не получается реализовать работу данного контейнера со структурой.
applegrub вне форума Ответить с цитированием
Старый 14.03.2012, 00:13   #2
pproger
C++ hater
Старожил
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

нужно либо у структуры определить оператор 'меньше', либо передать свой компаратор вторым шаблонным параметром
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 14.03.2012, 00:17   #3
applegrub
Пользователь
 
Регистрация: 30.10.2011
Сообщений: 22
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
нужно либо у структуры определить оператор 'меньше', либо передать свой компаратор вторым шаблонным параметром
А можете привести пример? Спасибо
applegrub вне форума Ответить с цитированием
Старый 14.03.2012, 00:31   #4
applegrub
Пользователь
 
Регистрация: 30.10.2011
Сообщений: 22
По умолчанию

Код:
void main() {
              struct B {
                     int a;
	       int b;
	} C;

             bool operator < (const B & a, const B & b) {
                   return B.a < B.b;
             }

	multiset<B> A;
	multiset<B>::iterator it;


   it=A.insert(C);  // вот здесь ошибка
}
Все равно ошибка
applegrub вне форума Ответить с цитированием
Старый 14.03.2012, 00:41   #5
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Код:
struct B {
	int a;
	int b;
	friend  bool operator < ( const B& lft, const B& rgt)
	{
		return  lft.a<rgt.a;
	}
};
EUGY вне форума Ответить с цитированием
Старый 14.03.2012, 00:49   #6
applegrub
Пользователь
 
Регистрация: 30.10.2011
Сообщений: 22
По умолчанию

Цитата:
Сообщение от EUGY Посмотреть сообщение
Код:
struct B {
	int a;
	int b;
	friend  bool operator < ( const B& lft, const B& rgt)
	{
		return  lft.a<rgt.a;
	}
};
Написал, как вы сказали. Компилятор выдал ошибку:

Код:
a friend function cannot be defined within a local class
applegrub вне форума Ответить с цитированием
Старый 14.03.2012, 00:56   #7
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

struct B
{
//....
};

int main (...)
{
B C;
}
EUGY вне форума Ответить с цитированием
Старый 14.03.2012, 01:00   #8
applegrub
Пользователь
 
Регистрация: 30.10.2011
Сообщений: 22
Радость

Спасибо, все заработало)))
applegrub вне форума Ответить с цитированием
Старый 14.03.2012, 01:00   #9
pproger
C++ hater
Старожил
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2applegrub
я не знаю семантики твоей структуры, поэтому покажу на своем примере. есть структура описывающая точку на плоскости. "меньшая" из двух точек это та, у которой координата Х меньше. если координаты Х равны, то меньшая та, у которой Y меньше.

код собственно такой
Код:
#include <iostream> 
#include <set> 

using namespace std;

struct Point {
	int m_x;
	int m_y;

	Point() : m_x(0), m_y(0) {}

	Point(int x, int y) : m_x(x), m_y(y) {}

	Point(const Point &another) : m_x(another.m_x), m_y(another.m_y) {}

	Point &operator=(const Point &another)
	{
		if (&another != this) {
			m_x = another.m_x;
			m_y = another.m_y;
		}
		return *this;
	}

	bool operator<(const Point &another) const
	{
		if (this->m_x < another.m_x)
			return true;
		if (this->m_x == another.m_x)
			return this->m_y < another.m_y;
		return false;
	}
};

int main()
{
	multiset<Point> mySet;

	mySet.insert(Point(1, 1));
	mySet.insert(Point(2, 2));
	mySet.insert(Point(1, 2));
	mySet.insert(Point(1, 1));

	for (multiset<Point>::const_iterator It = mySet.begin(); It != mySet.end(); ++It)
		cout << "(" << It->m_x << ", " << It->m_y << ")" << endl;

	return 0;
}
в нагрузку я реализовал оператор присваивания и конструктор копирования (их необходимость зависит от конкретной структуры, для моей они не нужны, но всеж пусть будет для наглядности).

вывод собственно
Цитата:
(1, 1)
(1, 1)
(1, 2)
(2, 2)
какой и ожидается
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 14.03.2012, 02:41   #10
applegrub
Пользователь
 
Регистрация: 30.10.2011
Сообщений: 22
По умолчанию

Спасибо
applegrub вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
контейнер deque Альбинаа Помощь студентам 0 14.12.2010 14:01
Сортировка multiset m9yt Общие вопросы C/C++ 5 11.05.2010 00:48
Контейнер ! curtcobain Общие вопросы Delphi 3 04.02.2009 20:27