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

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

Войти
Регистрация
Восстановить пароль
 
 
Renji
1968 / 1366 / 308
Регистрация: 05.06.2014
Сообщений: 3,898
#1

Требуется собрать кучу object в один контейнер и искать их по object_name - C++

23.07.2014, 14:09. Просмотров 702. Ответов 21
Метки нет (Все метки)

Пусть дана структура вида:
C++
1
2
3
4
5
6
7
8
struct object
{
    object(const std::string&_object_name):object_name(_object_name){}
    bool operator<(const object&o)const{return object_name<o.object_name;}
    bool operator<(const std::string&str)const{return object_name<str;}
    std::string object_name;
    char some_data[100500];
};
Требуется собрать кучу object в один контейнер и искать их по object_name. При этом хочется соблюдать следующие условия:
1) У object должен сохраниться доступ к своему object_name.
2) object_name не должен дублироваться в каких-то внутренних индексах контейнера (потому что возможен алгоритм обходящийся без дублирования). То есть, std::map хранящий ключ сортировки отдельно не подходит.
3) find(object_name) не должно требовать преобразования object_name из std::string в object (там some_data на 100500 байт).
4) Вставка нового элемента не должна делать ссылки на существующие элементы невалидными (отсортированный вектор object не подойдет).

Реализуемо ли это какими-то готовыми библиотеками (например, boost)? И ясно, вроде, что алгоритмически это ничем принципиально не отличается от std::set. Но как я понимаю, find в std::set<object> принимает только аргумент типа object. Пусть даже есть operator< позволяющий сравнивать object напрямую с std::string.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.07.2014, 14:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Требуется собрать кучу object в один контейнер и искать их по object_name (C++):

Как собрать файлы в кучу? - C++
В книге Страуструпа для начинающих, в 8 главе квест, на создание заголовочного файла, и два сpp файла тк вот В папке с...

Чем дальше в лес, тем больше дров. Не соображу, как собрать в кучу - C++
К окончанию курсов по С++ нам приурочили мини-дипломную работу. Сначала я посчитала, что ничего сложного в этом нет. Но по мере моих...

Собрать кучу файлов в один файл Excel - C#
Добрый день! И снова смиренно прошу советов гуру. Исходные данные: около 600 файлов формата csv(3 параметра в строчке) Задача: Собрать...

VBA EXCEL: Собрать кучу файлов в один - VBA
В папке находится куча xls файлов. У всех у них одинаковая структура. Но она может меняться периодически. Необходимо все файлы собрать в...

Notepad++ как собрать все ссылки со страницы в одну кучу? - Софт
Добрый день! Как в Notepad++ можно собрать все ссылки, присутствующие на странице и положить в самый низ? То есть мне нужно записать...

Подскажите, где нужно искать конструктор класса Object? - Java SE
Всем привет! Изучаю java совсем недавно. Заинтересовал один фундаментальный момент - в исходнике класса Object нет конструктора, хотя, по...

21
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
23.07.2014, 16:32 #16
Цитата Сообщение от Renji Посмотреть сообщение
дублируется ключ сортировки, чего и хотелось избежать.
А если и на него указатель завести? Т.е. если создаем proxy с object != nullptr, то используем указатель на object->name, иначе (как при поиске) - полноценный std::string.
1
Voivoid
675 / 278 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
23.07.2014, 16:43 #17
Ну, тогда boost::unordered_set как вариант, там методу find можно предикат передать
1
Renji
1968 / 1366 / 308
Регистрация: 05.06.2014
Сообщений: 3,898
23.07.2014, 17:18  [ТС] #18
А если и на него указатель завести? Т.е. если создаем proxy с object != nullptr, то используем указатель на object->name, иначе (как при поиске) - полноценный std::string.
Костыль, конечно, но похоже это единственное решение без написания своего std::set.
Ну, тогда boost::unordered_set как вариант, там методу find можно предикат передать
Попробовал. find скушало std::string как аргумент... И все равно полезло преобразовывать его в object.
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
25
#include<string>
#include<boost/unordered_set.hpp>
using namespace std;
struct object
{
    bool operator<(const object&o)const{return object_name<o.object_name;}
    bool operator==(const object&o)const{return object_name==o.object_name;}
    bool operator<(const std::string&str)const{return object_name<str;}
    bool operator==(const std::string&str)const{return object_name==str;}
    std::string object_name;
    char some_data[100500];
private://чтоб нельзя было выполнить преобразование строки в object
    object(const std::string&_object_name):object_name(_object_name){}
};
 
struct hash_value{int operator()(const object&str)const{return str.object_name.size();}};
struct compare{bool operator()(const object&o1,const object&o2)const{return o1==o2;}};
 
int main()
{
    boost::unordered_set<object> my_set;
    const std::string key("1234");
    my_set.find<std::string,hash_value,compare>(key,hash_value(),compare());
    return 0;
}
error: 'object::object(const string&)' is private. То есть, буст полез выполнять преобразование и обломался.
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
23.07.2014, 17:32 #19
Цитата Сообщение от Renji Посмотреть сообщение
private://чтоб нельзя было выполнить преобразование строки в object
тут вероятно следует просто explicit конструктор сделать.
1
Renji
1968 / 1366 / 308
Регистрация: 05.06.2014
Сообщений: 3,898
23.07.2014, 17:44  [ТС] #20
Попробовал. find скушало std::string как аргумент... И все равно полезло преобразовывать его в object.
UPD Туплю. Сделал так и заработало:
C++
1
2
3
4
5
6
7
8
9
struct hash_value{
    int operator()(const object&str)const{return str.object_name.size();}
    int operator()(const std::string&str)const{return str.size();}
};
struct compare{
    bool operator()(const object&o1,const object&o2)const{return o1==o2;}
    bool operator()(const object&o1,const std::string&o2)const{return o1==o2;}
    bool operator()(const std::string&o1,const object&o2)const{return o2==o1;}
};
0
Voivoid
675 / 278 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
23.07.2014, 19:19 #21
Цитата Сообщение от Renji Посмотреть сообщение
C++
1
2
3
4
struct hash_value{
 int operator()(const object&str)const{return str.object_name.size();}
 int operator()(const std::string&str)const{return str.size();}
};
воу-воу-воу, ты же надеюсь не считаешь так хэши и привел этот код только для примера уровня компилируется/не компилируется?
0
Renji
1968 / 1366 / 308
Регистрация: 05.06.2014
Сообщений: 3,898
23.07.2014, 19:23  [ТС] #22
воу-воу-воу, ты же надеюсь не считаешь так хэши и привел этот код только для примера уровня компилируется/не компилируется?
Разумеется. Для тестового примера нет смысла делать что-то более сложное чем "лишь бы хоть что-то считалось для галочки".
0
23.07.2014, 19:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.07.2014, 19:23
Привет! Вот еще темы с ответами:

Разбить один m-файл на кучу маленьких m-файлов - Matlab
Здравствуйте. Я не новичок в Matlab. Однако просто раньше такого не требовалось. У меня ну просто огромный программный код в m-файле. Можно...

Заворачивание колонки материалов в один контейнер - HTML, CSS
Здравствуйте. Есть компонент для joomla, K2. Он не выводит материал в две колонки, хотя в joomla все в порядке, материал выводится. Бьюсь...

Программа для шифрования файлов в один контейнер. Оцените реализацию - C#
Приветствую. Написал свою первую программу. Суть такая: Выбираются файлы, добавляются в контейнер(zip) и потом этот контейнер шифруется...

Один контейнер залазит на другой при уменьшении окна браузера - HTML, CSS
Добрый вечер, для удобства размещения блоков использую &quot;flex&quot;, плюс в том что задав &quot;justify-content: space-between;&quot; я могу вставлять еще...


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

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

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