как хранить и ссылаться на большой объем данных в c

#c #vector #shared-ptr

#c #вектор #shared-ptr

Вопрос:

Я использую вектор строк для хранения некоторых данных в памяти. База данных — это не вариант. Точнее, массив векторных строк. Простой сценарий: мне нужно сохранить имена людей, живущих в 256 городах.

Пример

 NewYork: John, Bod, ...
London: Jim, Bill...
 

для этого требования я использовал

 vector<std::string> city[256];
 

Появилось новое требование для создания нового «класса Person», который будет содержать больше данных для каждого элемента

 class person {
 string name;
 string surname;
 string email;
 int age;
};
 

Я рассматриваю эту проблему для того, чтобы найти оптимальный способ хранения и совместного использования этих данных.

 vector<class person> city[256];
 

Очевидно, что лучше использовать указатель на объекты. применяется ли здесь shared_ptr? У нас
в системе установлен TR1, но мы не можем использовать boost-библиотеки.

Комментарии:

1. «Мне нужно сохранить фамилии 256 городов»: «пожалуйста, приведите пример города, у которого есть имя и фамилия.

2. Действительно ли 256 городов — это «большой объем данных»?

3. @AlfP.Steinbach: Нью-Йорк? 😉

4. В России есть хотя бы один город с отчеством 😉

5. У вас есть только один глобальный экземпляр этих данных или вам нужно передавать их и манипулировать ими?

Ответ №1:

Если у вас есть C 11 и вам нужна только одна глобальная версия этих данных, вы можете использовать структуру данных, подобную этой:

 #include <unordered_map>
#include <unordered_set>
#include <string>

typedef std::unordered_multiset<std::string> name_set;
typedef std::unordered_map<std::string, name_set> city_map;

city_map city_db {
  { "Moscow", { "Ivan", "Igor", "Vladimir" } },
  { "Madrid", { "Julio", "Pedro", "Sanchez" } },
  { "Munich", { "Sepp", "Huber", "Maier" } }
};

int main()
{
  return city_db["Munich"].size(); // just as an example
}
 

Ответ №2:

Города, люди.. время рассмотреть базу данных.

Комментарии:

1. DB — это не вариант. Я обновил свой вопрос. Мне нужны эти данные в памяти процесса

2. @cateo: Вы знаете, вам не нужно иметь внешний сервер для базы данных. Существуют и чистые базы данных в процессе.

Ответ №3:

Или использовать вектор векторов? или список векторов?

Ответ №4:

Вы можете использовать shared_ptr, или собственный указатель, или сохранить как значение. Это зависит. Вы хотите самый быстрый поиск? Вы хотите сэкономить на памяти? Вам нужны данные в непрерывной памяти? Вы хотите поддерживать потоковую обработку? Общего правильного ответа нет. 256 объектов — это не огромный объем данных.

Комментарии:

1. Я обновил свой вопрос. Мне нужно 256 векторов. Каждый вектор может расти… БД не вариант, и мы используем потоки.

Ответ №5:

Я бы не сказал, что это так очевидно, что указатели лучше. Да, вы можете хранить shared_ptr в коллекции, хотя в зависимости от того, как вы получаете доступ к данным, вы также можете предпочесть использовать list или map вместо этого.