Приветствую!
В силу необходимости храню данные в map<string,string>, так как не знаю заранее, какой ключ будет, так как ключи создаются дефайнами.
Типа такого:
#define AAA(_name) CType *_name = new CType(#_name);
И в последствии #_name попадает в мап в качестве ключа.
Хочется избавиться от строк в качестве ключа, подскажите как извернуться?
Здравствуйте, Sheridan, Вы писали:
S>Приветствую! S>В силу необходимости храню данные в map<string,string>, так как не знаю заранее, какой ключ будет, так как ключи создаются дефайнами. S>Типа такого: S>#define AAA(_name) CType *_name = new CType(#_name); S>И в последствии #_name попадает в мап в качестве ключа. S>Хочется избавиться от строк в качестве ключа, подскажите как извернуться?
можно хеш/контрольную сумму вместо строк использовать?
Здравствуйте, Sheridan, Вы писали:
S>Приветствую! S>В силу необходимости храню данные в map<string,string>, так как не знаю заранее, какой ключ будет, так как ключи создаются дефайнами. S>Типа такого: S>#define AAA(_name) CType *_name = new CType(#_name); S>И в последствии #_name попадает в мап в качестве ключа. S>Хочется избавиться от строк в качестве ключа, подскажите как извернуться?
Приветствую, Sashaka, вы писали:
S> можно хеш/контрольную сумму вместо строк использовать?
Главное стобы потом читабельно было. Потом из мапа уже я достаю string а=amap["mystring"], а хотелось бы string a=amap[mystring]
Здравствуйте, Sheridan, Вы писали:
S>Приветствую! S>В силу необходимости храню данные в map<string,string>, так как не знаю заранее, какой ключ будет, так как ключи создаются дефайнами. S>Типа такого: S>#define AAA(_name) CType *_name = new CType(#_name); S>И в последствии #_name попадает в мап в качестве ключа. S>Хочется избавиться от строк в качестве ключа, подскажите как извернуться?
Мало что понял. Как присваиваются и читаются значения, где пишется AAA(_name) ?
Здравствуйте, Sheridan, Вы писали:
S>Честно говоря мало чего понял...
вместо Вашего map<string, string> я предлагаю использовать map<unsigned __int64, string> при помощи id_generator<string, unsigned __int64>. т.е.:
но все это имеет смысл лишь только в том случае, когда у Вас your_class::m_map содержит достаточно большое количество элементов и Вам необходимо часто копировать один объект типа your_class в другой.
Мой компьютер прогоняет бесконечный цикл за 9 секунд, но, мне кажется, он мог бы сделать это быстрее...
Здравствуйте, Sheridan, Вы писали:
S>И в последствии #_name попадает в мап в качестве ключа. S>Хочется избавиться от строк в качестве ключа, подскажите как извернуться?
Я так понял, что тебе хочется заводить C++ id в макросах, а потом иметь возможность использовать эти id в качестве ключей? При этом аллокируемые из макроса CType должны знать свои id?
Не ясно тут ещё вот что. в каком пространстве имён должны заводиться эти id?
Один из путей, например, таков:
enum MyID { MyID_0, MyID_MAX = INT_MAX };
class CTypeManager {
public:
static MyID NewID()
{
MyID newId = allocId();
findOrAllocCType( newId );
return newId;
}
static CType& Get( MyID id )
{
assert( 0 <= id && id < seed );
return findOrAllocCType( id );
}
private:
static int seed; // == 0static MyID allocId()
{
return static_cast<MyID>( seed++ );
}
static CType& findOrAllocCType( MyID id )
{
static std::vector<CType> data;
while( id >= data.Size() ) {
data.push_back( CType( static_cast<MyID>( data.size() ) ) );
}
assert( data[id].GetID() == id );
return data[id];
}
};
#define AAA(_name) const MyID = CTypeManager::NewID();
Дальше, для доступа к CType всегда используем CTypeManager::Get( id );
Второй путь -- заводить в AAA каждый раз новую структуру, например, и инстанцировать параметризированный этой структурой шаблон. Что-то типа
inline int allocId() { static int i = 0; return i++; }
template<typename TSeed>
struct CTypeIdHolder {
CTypeIdHolder( const char* ) : //... тут запоминаем строчки, вычисляем что там нам надо, прихраниваемstatic const int Id;
};
template<typename TSeed>
const int CTypeIdHolder<TSeed>::Id = allocId();
#define AAA(NAME) struct NAME; CTypeIdHolder<struct NAME> NAME( #NAME );
Ну и всегда теперь можем написать код, который по имени структуры получает id и лезет в map. Правда при таком подходе нельзя иметь переменную, содержащую имя ключа...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Sheridan, Вы писали:
S>Ммм... А будет ли это быстрее работать, нечели поиск по строковому ключу мапа?
Что "это"? Индексирование массива или поиск по ключу? Наверняка да...
Впрочем я не до конца понимаю твою задачу, так что на самом деле
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском