我需要使用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; &安培;'
上述问题的确切解决方案应该是什么?
此致
答案 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 *)/ ....
因此,我建议您更多地考虑您的需求并相应地设计数据结构。