powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Различные структуры данных. Реализация
25 сообщений из 422, страница 16 из 17
Различные структуры данных. Реализация
    #39290270
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglПричина в каких то округлениях (
abs() сначала к целочисленному привел, т.к. должно быть так
http://www.cplusplus.com/reference/cstdlib/abs/ int abs ( int n);
long int abs ( long int n);
long long int abs (long long int n);
а MS от себя добавил
Код: plaintext
1.
float abs(float)


потому я и не заметил. Лучше заменить на fabs()
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39290294
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у вас #include разные
http://www.cplusplus.com/reference/cmath/abs/ double abs (double x);
float abs (float x);
long double abs (long double x);
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39290307
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tа MS от себя добавил
Это не MS а С++ добавил от себя ))
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39290362
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я добавлял <cmath>, не помогло.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39290365
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня
Код: plaintext
1.
#include <math.h>
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39290687
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий, а почему компаратор реализован именно так, как он реализован? Я думал что это будет классическая функция. Так необходимо для работы с set?
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39290690
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryДмитрий, а почему компаратор реализован именно так, как он реализован? Я думал что это будет классическая функция. Так необходимо для работы с set?
Это требование стандарта
http://en.cppreference.com/w/cpp/concept/Compare
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39290702
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky, спасибо, но я мало что понял по существу, здесь видимо влияет мой незначительный объем знаний в С++.

В зарубежных работа по математике для обозначения операторов или левой части уравнения иногда используют lhs, только потому я догадался почему параметры функции названы так, как они названы. Впрочем затем я открыл стандарт, и нашел там аналогичные обозначения :)
Не очень понял почему после имени структуры идет двоеточие, но думаю, что смогу разобраться. У меня другой вопрос: сколько значений возвращает данный компаратор и какие эти значения?
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39290782
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryДмитрий, а почему компаратор реализован именно так, как он реализован? Я думал что это будет классическая функция. Так необходимо для работы с set?
Так необходимо для сравнения float . Т.к. это экспоненциальный формат и при вычислении накапливается погрешность в последних разрядах мантиссы, то его нельзя просто сравнить, надо учитывать погрешность.

Второй вариант - перед сохранением в set округлять, тогда можно будет вообще без компаратора обойтись.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39290804
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury, пример с демонстрацией проблемы
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
typedef std::set<float> fixed_set_t;

int main() {
	fixed_set_t arr;
	float x = 7.;
	float y = x / 13.;
	float z = y * 13.;
	printf("%s\n", x == z ? "true" : "false");
	arr.insert(x);
	arr.insert(y);
	arr.insert(z);
	for (fixed_set_t::iterator it = arr.begin(); it != arr.end(); ++it)
		std::cout << ' ' << *it << "\n";
	return 0;
}

...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39290822
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryУ меня другой вопрос: сколько значений возвращает данный компаратор и какие эти значения?
два значения. true/false. Просто сравнение "lhs < rhs"
http://www.cplusplus.com/reference/set/set/set/
Код: plaintext
1.
2.
3.
4.
struct classcomp {
  bool operator() (const int& lhs, const int& rhs) const
  {return lhs<rhs;}
};
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39291086
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TSashaMercuryДмитрий, а почему компаратор реализован именно так, как он реализован? Я думал что это будет классическая функция. Так необходимо для работы с set?
Так необходимо для сравнения float . Т.к. это экспоненциальный формат и при вычислении накапливается погрешность в последних разрядах мантиссы, то его нельзя просто сравнить, надо учитывать погрешность.

Второй вариант - перед сохранением в set округлять, тогда можно будет вообще без компаратора обойтись.

Да нет, мне непонятен синтаксис реализации, но это мои проблемы - разберусь)

Dima Tдва значения. true/false. Просто сравнение "lhs < rhs"

Но в том случае если разница между числами меньше погрешности, то происходит возврат 0. Этот момент не очень понял
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39291105
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryНо в том случае если разница между числами меньше погрешности, то происходит возврат 0. Этот момент не очень понял
Этот функтор должен реализовывать операцию сравнения "меньше".
Т.е. если первое число меньше второго, то возвращается true, а иначе (включая равенство в пределах заданной погрешности) - false.

ЗЫ. Двоеточие это синтаксис наследования.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39291109
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryDima Tдва значения. true/false. Просто сравнение "lhs < rhs"

Но в том случае если разница между числами меньше погрешности, то происходит возврат 0. Этот момент не очень понял
ИМХУ: для проверки уникальности надо выполнить сравнение, имея компаратор сравнивающий только на меньше можно сделать так
Код: plaintext
1.
if(!comp(lhs, rhs) && !comp(rhs, lhs)) ... значит равно
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39291110
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, и true==1, false==0.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39291130
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е данный код

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
struct fixed_compare :
	public
	std::binary_function<float, float, bool>
{
	bool operator() (const float& lhs, const float& rhs) const
	{
		if (abs(lhs - rhs) < 0.0009) {
			return 0; // ==
		} else {
			return lhs < rhs;
		}
	}
};


аналогичен такому?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
struct fixed_compare : public std::binary_function<float, float, bool>
{
	bool operator() (const float& lhs, const float& rhs) const
	{
		return !((abs(lhs - rhs) < 0.0009) || (lhs>rhs));
	}
};
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39291135
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А binary_function судя о всему один абстрактных классов стандартной библиотеки
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39291138
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне не нравится, что он с маленькой буквы, кажется что это функция или метод, а не класс
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39291139
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аналогичен, можно покороче
Код: plaintext
1.
return lhs < rhs && abs(lhs - rhs) > 0.0009;
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39291142
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryМне не нравится, что он с маленькой буквы, кажется что это функция или метод, а не класс
В STL все с маленькой буквы и с подчеркиваниями если несколько слов. Такой стиль выбрали, привыкай. http://www.cplusplus.com/reference/stl/
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39291152
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все спасибо C: В целом я понял, детали постараюсь сам разобрать
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39291161
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryА binary_function судя о всему один абстрактных классов стандартной библиотеки
На самом деле для реализации компаратора set от нее можно вообще не наследовать. Просто сделайте класс с оператором ().
Единственное предназначение этого наследования - подключить вложенные типы, которые дают возможность узнать типы аргументов и результата (если это нужно для реализации шаблона, использующего это класс).
В С++11 это можно сделать напрямую, без помощи со стороны класса, поэтому binary_function (и подобные) будет удалена, так что ее не надо даже начинать использовать.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39291165
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyНа самом деле для реализации компаратора set от нее можно вообще не наследовать. Просто сделайте класс с оператором ().
Это я откуда-то скопипастил с binary_function, тут примеры без нее.
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39291169
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryМне не нравится, что он с маленькой буквы, кажется что это функция или метод, а не класс
На самом деле, это даже логично, т.к. во многих случаях никакой разницы между использованием класса и функции нет ))

Код: plaintext
1.
2.
auto val1 = class_name(args);
auto val2 = function_name(args);
...
Рейтинг: 0 / 0
Различные структуры данных. Реализация
    #39291172
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskySashaMercuryМне не нравится, что он с маленькой буквы, кажется что это функция или метод, а не класс
На самом деле, это даже логично, т.к. во многих случаях никакой разницы между использованием класса и функции нет ))

Код: plaintext
1.
2.
auto val1 = class_name(args);
auto val2 = function_name(args);



В первом случае может вызываться только конструктор?
...
Рейтинг: 0 / 0
25 сообщений из 422, страница 16 из 17
Форумы / C++ [игнор отключен] [закрыт для гостей] / Различные структуры данных. Реализация
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]