2011-04-19 65 views
0

我有一个需要放入C++容器的结构。这里是结构:C++双重访问查找操作所需的结构容器

struct PDCUTestMessage 
{ 
string name; 
unsigned char id; 
int numberOfParameters; 
string param1Name; 
string param2Name; 
string param3Name; 
string param4Name; 
string param5Name; 
boost::function<void(vector<unsigned char>)> process; 
PDCUTestMessage(); 
PDCUTestMessage(string_name, unsigned char _id, int _numberOfParameters, boost::function<void(vector<unsigned char>)> _process): name(_name), id(_id), numberOfParameters(_numberOfParameters), process(_process){} 
}; 

我需要这些结构的65,所以我希望把它们放入一个容器(我在想一个列表,向量,或地图)。我需要能够通过两个不同的搜索值:name和id来访问给定PDCUTestMessage的函数指针(进程)。我注意到地图只允许一个值和一个键。有没有任何容器可以让我快速搜索使用名称或ID作为密钥的PDCUTestMessage?我该如何编写搜索并访问指针指向的函数?

我希望这是有道理的。让我知道你是否需要进一步澄清。

谢谢!

+0

如果你有“约65”的对象,使用std :: vector会很好。 – 2011-04-19 17:10:30

回答

1

由于您已经在使用boost,因此可以在此处使用boost.multi-index容器库。请特别考虑Multiple sort教程部分中的示例。

+0

这看起来很有希望。我对C++很陌生,所以我希望我能理解它。在此上下文中使用多索引的其他参考或示例? – Tangleman 2011-04-19 18:43:34

0

只有65个物品在您的容器中,简单的线性搜索可能足够快以满足您的需求。使用该名称作为您的地图(或设置)的关键字,并在需要按ID搜索时使用std :: find。

+0

我还没有做很多地图和std :: find。我的印象是,你只能使用地图条目的关键字进行搜索,或者至少这些是我发现的例子。你有没有任何例子可以说明我会如何使用地图来查找?顺便说一下,ID将是最常用的关键。那么我会把它与你所说的相反吗?用ID作为键和STD ::查找名称? – Tangleman 2011-04-19 18:46:51

0

如前所述Boost.MultiIndex是解决这样的问题的一种方法。这是非常强大和快速,但在大多数情况下,它只是意味着编译速度慢,复杂的代码,而没有得到其他好处。

65个项目并不是很多,Mark Ransom提到线性搜索对于您所做的工作来说可能工作得很好。这需要测量。

另一种方式做事是有一个std ::矢量持有的消息(65个消息),然后你可以有你使用查找两个单独的容器:首先是ID对指数和第二个名字-to-指数。索引是消息在向量中的位置。事情是这样的:

class YourContainerClass 
{ 
public: 
    bool lookupById(unsigned char id, PDCUTestMessage& message) 
    { 
     std::map<unsigned char, int>::iterator it = idToIndexMap.find(id); 
     if (it == idToIndexMap.end()) 
      return false; 
     message = messages[*it]; 
     return true; 
    } 

    bool lookupByName(const std::string& name, PDCUTestMessage& message) 
    { 
     std::map<std::string, int>::iterator it = nameToIndexMap.find(id); 
     if (it == nameToIndexMap.end()) 
      return false; 
     message = messages[*it]; 
     return true; 
    } 

private: 
    std::vector<PDCUTestMessage> messages; 
    std::map<unsigned char, int> idToIndexMap; 
    std::map<std::string, int> nameToIndexMap; 
}; 

管理内部容器的刀片必须做到在信息载体的push_back工作,同时插入两张地图相应的东西,发现从ID向量索引和名字。

这只是API的一种方式。您也可以将这些消息包装在boost::shared_ptr中以获得有点不同的API。这有点不属于你的问题,因为我也不知道你打算如何使用这些消息及其生命周期。

即使Boost.MultiIndex是一个非常酷的容器,它应该不是第一个选项。有很多方法可以做到这一点,它归结为最有意义的具体问题。

希望你找到对你最有意义的东西。