#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
вместо этого.