如何在地图中使用STL未排序的键值作为对

时间:2010-09-30 11:07:04

标签: c++ stl map

我需要使用STL C ++映射来存储键值对。 我需要在stl map中存储多个数据信息。 e.g

需要以字符串格式存储DataType,Data及其行为(在param / outparam中)。 但是地图总是使用键值对

所以,如果我 存储它像

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

但总是根据我不想要的键对数据进行排序。如果我喜欢..

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

这会提示编译时错误!

错误C2664:'std :: pair&lt; _Ty1,_Ty2&gt; :: pair(const std :: pair&lt; _Ty1,_Ty2&gt;&amp;)':无法将参数1从'const char *'转换为'const std: :一对&LT; _Ty1,_Ty2&GT; &安培;'

上述问题的确切解决方案应该是什么?

此致

4 个答案:

答案 0 :(得分:4)

如果您不想订购,请不要使用地图或集等有序容器。你可以使用类和向量来实现你正在寻找的东西。 std :: map的排序特性使得按键查找变得高效。如果您想要/需要未分类和更多类似哈希的查找行为,请查看Boost unordered containers。请注意,这并不能保证订单将成为订单。我假设您要保留放入容器的类型的顺序,下面的示例将会这样做。

#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;
}

答案 1 :(得分:2)

您在

中声明错误变量
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" ) );

此外,正如其他人所说,如果您不想要排序顺序,请使用TR1或Boost中的unordered_map。如果您使用的是MS,则可以使用hash_map代替。

答案 2 :(得分:1)

  

需要存储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;

你有一个设计问题,而不是编程问题。

答案 3 :(得分:1)

为什么你首先使用地图?你想用什么作为查找键 - 数据类型?价值? “param / outparam”特征?

无论你想用什么键作为键都应该先行,其余的可以是结构/指针/字符串(* urg *)/ ....

因此,我建议您更多地考虑您的需求并相应地设计数据结构。