Как использовать несортированный ключ-значение STL как пару в карте - PullRequest
1 голос
/ 30 сентября 2010

Мне нужно использовать карту STL C ++ для хранения пар ключ-значение.Мне нужно хранить более одной информации данных в карте STL.например,

Необходимо хранить DataType, Data и их поведение как (в параметре / outparam) все в строковом формате.Но карта всегда использует пару ключ-значение

, поэтому, если я храню ее как

std::map<map<"int","50",>"behavior">. 

, но всегда сортирует данные на основе ключей, которые мне не нужны.Если я использую как ..

pair<string, pair<string,string> >;
pair<string, pair<string,string>>("int",("100","in"));

Это вызывает ошибку во время компиляции!

ошибка C2664: 'std :: pair <_Ty1, _Ty2> :: pair (const std :: pair <_Ty1, _Ty2> &) ': невозможно преобразовать параметр 1 из' const char * 'в' const std :: pair <_Ty1, _Ty2> & '

Каким должно быть точное решение вышеуказанной проблемы?

С уважением

Ответы [ 4 ]

4 голосов
/ 30 сентября 2010

Если вы не хотите заказывать, не используйте заказанные контейнеры, такие как карта или набор.Вы можете достичь того, что вы ищете, используя класс и вектор.Сортированная природа std :: map делает поиск по ключу эффективным.Если вы хотите / нуждаетесь в несортированном и более хэш-подобном поведении для поиска, посмотрите Увеличить неупорядоченные контейнеры .Обратите внимание, что это не гарантирует, что заказ будет таким.Я предполагаю, что вы хотите сохранить порядок типов, которые вы помещаете в контейнер, пример ниже сделает это.

#include <iostream>
#include <vector>

using namespace std;

class DataBehavior
{
public:
    DataBehavior(const string &type, 
                 const string &data,
                 const string &behavior)
        :type(type), data(data), behavior(behavior)
    {
    }

    const string &getType() const     { return type; }
    const string &getData() const     { return data; }
    const string &getBehavior() const { return behavior; }

private:
    string type;
    string data;
    string behavior;
};

typedef vector<DataBehavior> Ctr;

int main (int argc, char *argv[])
{
    Ctr ctr;
    ctr.push_back(DataBehavior("int",    "50", "behavior"));
    ctr.push_back(DataBehavior("int",    "80", "behavior"));
    ctr.push_back(DataBehavior("string", "25", "behavior2"));

    for (Ctr::const_iterator it = ctr.begin(); it != ctr.end(); ++it)
    {
        cout << "Type: " << it->getType() << "  " 
             << "Data: " << it->getData() << "  "
             << "Behavior: " << it->getBehavior() << "\n";
    }
    return 1;
}
2 голосов
/ 30 сентября 2010

Вы объявляете переменные неправильно в

pair<string, pair<string,string> >;
pair<string, pair<string,string>>("int",("100","in"));

Вам нужно будет сделать

pair<string, pair<string,string>>("int",pair<string,string>("100","in"));

что довольно многословно. Вы можете использовать функцию make_pair, чтобы значительно сократить это:

make_pair( "int", make_pair( "100", "in" ) );

Также, как уже говорили другие, если вы не хотите сортировать порядок, используйте unordered_map из TR1 или Boost. Если вы используете MS, вместо этого вы можете использовать hash_map.

1 голос
/ 30 сентября 2010

Почему вы используете карту в первую очередь? Что вы хотите использовать в качестве ключа поиска - тип данных? Значение? Характеристика «param / outparam»?

Все, что вы хотите использовать в качестве ключа, должно идти первым, а остальное может быть struct / pointer / string (* urg *) / ....

Поэтому я предлагаю вам еще немного подумать о своих потребностях и соответствующим образом спроектировать структуру данных.

1 голос
/ 30 сентября 2010

Нужно хранить DataType, Data и его поведение как (в param / outparam) все в формат строки Но карта всегда использует ключ пара значений

Мне кажется, вам нужно использовать другую структуру данных, например,

typedef std::tuple<std::string,               // DataType
                   std::string,               // Data
                   std::string> element_type; // behaviour

// use can replace tuple with sth like: 
//struct element_type {
//    std::string m_DataType;
//    std::string m_Data;
//    std::string m_Behaviour;
//    ... ctors, operators ...
//};
// or even with std::array<std::string, 3>

std::set<element_type> elements_set;

// or

typedef int32_t element_id;

std::map<element_id, element_type> elements_map;

И у вас есть скорее проблема дизайна, чем проблема программирования.

...