双访问查找操作所需的C ++容器结构

时间:2011-04-19 16:56:36

标签: c++ search struct find containers

我有一个需要在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个这些结构,所以我希望将它们放入容器中(我正在考虑列表,矢量或地图)。我需要能够通过两个不同的搜索值访问给定PDCUTestMessage的函数指针(进程):name和id。我注意到地图只允许一个值和一个键。是否有任何容器可以让我快速搜索PDCUTestMessage使用name或id作为键?我将如何编写搜索并访问指针指向的函数?

我希望这是有道理的。如果您需要进一步澄清,请与我们联系。

谢谢!

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

65项目并不多,正如Mark Ransom提到的那样,线性搜索可以很好地适应你正在做的事情。这是你需要测量的。

另一种做事的方法是让std :: vector保存消息(65条消息),然后你可以有两个用于查找的独立容器:首先是id-to-index第二个是名称到索引。索引是向量中消息的位置。像这样:

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和name中找到向量中的索引。

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

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

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