Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
FortranDLL
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 94
#1

Контейнер с направлениями - C++

16.05.2016, 19:55. Просмотров 87. Ответов 8
Метки нет (Все метки)

Речь о следующем - пусть есть множество векторов (3 числа Double).
Надо добавлять в контейнер только вектора одного направления, то есть (1, 2, 1) и (-1, -2, -1) считаются имеющими тождественное направление - грубо говоря, определяют одну и ту же прямую. И поэтому надо добавить только один из них (любой).
Какую структуру для этого лучше всего использовать?
Возможно, придется это реализовывать не точно, с с учетом погрешности так идет речь о Double.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.05.2016, 19:55
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Контейнер с направлениями (C++):

контейнер - C++
Создать контейнер, в который можно добавлять и удалять методы. Размер контейнера должен увеличиваться автоматически. Вот такое задание ,...

Контейнер с указателями на... - C++
Можно ли создать контейнер с указателями на функции, и если да, то как можно вызывать эти функции? Все функции с одим аргументом.

класс-контейнер - C++
ArrayList — реализует интерфейс List. Как известно, в Java массивы имеют фиксированную длину, и после того как массив создан, он не может...

Контейнер map - C++
в программе используется ассоциативный массив, идентификатором которого являются символы проблема в том что появляется элемент с...

Контейнер set - C++
Есть текст на агл. языке. Используя контейнер set нужно упорядочить слова этого текста в алфавитном порядке. Вот то, что я сделал: ...

Контейнер hash_map - C++
Здорова! Нужно создать контейнер hash_map это тот же контейнер как и map, только он в разы иногда раз в 10-20 быстрее осуществляет поиск...

8
Programmist5
Заблокирован
16.05.2016, 20:21 #2
Ну во-первых 3 числа это три координаты точки, (x, y, z) или что? Если да, то надо нарисовать чертеж, расказать народу куда указывает какой вектор. Ну а вообще подходит вот такая структура:
C++
1
2
3
4
struct P3{
double x, y, z;}
 
P3 Massiv[100];
0
nmcf
5679 / 4990 / 1701
Регистрация: 14.04.2014
Сообщений: 20,357
16.05.2016, 20:25 #3
Обычную структуру struct и хранить в std::unordered_set.
1
FortranDLL
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 94
17.05.2016, 10:50  [ТС] #4
А можно прокомментировать чуть-чуть почему именно unordered_set, а например не map?
И можно ли будет встроить приближенную проверку, т.е. вектора считаются одного направления, если
А) модуль разности их компонент не превышает какого-то маленького числа (например, 10e-5).
либо
Б) модуль суммы их компонент не превышает какого-то маленького числа (если один вектор умножить на -1, то как раз разность превращается в сумму)
0
nmcf
5679 / 4990 / 1701
Регистрация: 14.04.2014
Сообщений: 20,357
17.05.2016, 16:07 #5
Ну тебе же не всё нужно хранить. Определишь операцию == для структуры, чтобы вычислять тождественность.
1
FortranDLL
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 94
17.05.2016, 16:27  [ТС] #6
Ну тебе же не всё нужно хранить. Определишь операцию == для структуры, чтобы вычислять тождественность.
ОК. А можно какой-нибудь простой пример, чтобы понять как это делается?
0
nmcf
5679 / 4990 / 1701
Регистрация: 14.04.2014
Сообщений: 20,357
17.05.2016, 16:40 #7
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
2
3
4
5
6
7
8
9
10
11
12
struct Vector
{
    int x, y, z;
 
    bool operator == (const Vector & r)
    {
        // Здесь пишешь алгоритм, по которому у тебя тождественность определяется для (x, y, z) и (r.x, r.y, r.z).
        // Если тождественны возвратить true, иначе false
    }
};
 
std::unordered_set<Vector> us;
1
FortranDLL
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 94
18.05.2016, 10:16  [ТС] #8
ОК. Спасибо. Не могу понять почему не транслируется код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//g++  4.9.3
 
#include <iostream>
#include <unordered_set>
 
int main()
{     
    struct Vector
{
    int x;
 
    bool operator == (const Vector & r)
    {
        if (x*r.x < 1)
            return 1;
        else
            return 0;
    }
};
 
std::unordered_set<Vector> us;
std::cout << "Hello, world!\n";
    
}
0
nmcf
5679 / 4990 / 1701
Регистрация: 14.04.2014
Сообщений: 20,357
18.05.2016, 13:17 #9
Да, там хэш-функция ещё нужна. Возьми vector.
C++
1
2
3
4
5
std::vector<Vector> vs;
 
Vector v;
 
if (std::find(vs.begin(), vs.end(), v) == vs.end()) vs.push_back(v);
0
18.05.2016, 13:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.05.2016, 13:17
Привет! Вот еще темы с ответами:

Контейнер list - C++
Добрый день! Помогите пожалуйста разобраться, никогда раньше не работал с листом. Задача следующая: В числовой последовательности...

Контейнер map - C++
Стоит задача реализовать контейнер map. Вопрос возникает при реализации итератора для этого контейнера. В итераторе должны быть реализованы...

Подскажите контейнер - C++
Нужно: Делать вставку по ключу, полный обход, удаление по ключу. Дубли не разрешены, сортировка не важна. Ключ std::pair&lt;int,int&gt;. ...

Контейнер set - C++
Два множества, элементами которого являются строчные буквы латинского алфавита, представлены с помощью стандартного типа SET. В программе...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.