c ++容器按键和值搜索

时间:2010-07-04 03:51:59

标签: c++ stl

我正在尝试构建一个由序数字符串表示的容器,可以通过字符串和数字进行搜索。例如,我可以通过数组来轻松地完成它,但效率很低:

std::string ordinalStrings = {"zeroth", "first", "second",..}

使用ordinalStrings [number]获取字符串,使用while(未找到)循环获取整数,但我认为其中一个STL容器会做得更好,只是不确定哪一个。

两者都无法搜索,例如,简单地使用字符串键获取地图的数字键就行了,但似乎没有它的功能,而且,它似乎有点凌乱。

顺便说一句,是否可以拥有一个恒定的STL容器?我只需要搜索功能,而不是插入。此外,由于我认为我不能,是否可以在没有初始化函数的情况下填充容器?也就是说,标题可以简单地说:

std::map<std::string, int> ordinals;
ordinals["zero"] = 0;
ordinals["one"] = 1;
...

对于基本上是常数值的初始化函数来说,似乎很愚蠢;

谢谢, 悦

2 个答案:

答案 0 :(得分:2)

Stephen建议使用Boost.MultiIndex,但这有点过分。

Boost.Bimap已经开发出来,并提供额外的功能。事实上它适合这项任务。它也是少数拥有(imho)良好文档的库之一:)

这是一个来自this page的例子。

#include <iostream>

#include <boost/bimap.hpp>

struct country  {};
struct place    {};

int main()
{
    using namespace boost::bimaps;

    // Soccer World cup.

    typedef bimap
    <
        tagged< std::string, country >,
        tagged< int        , place   >

    > results_bimap;

    typedef results_bimap::value_type position;

    results_bimap results;
    results.insert( position("Argentina"    ,1) );
    results.insert( position("Spain"        ,2) );
    results.insert( position("Germany"      ,3) );
    results.insert( position("France"       ,4) );

    std::cout << "Countries names ordered by their final position:"
                << std::endl;

    for( results_bimap::map_by<place>::const_iterator
            i    = results.by<place>().begin(),
            iend = results.by<place>().end() ;
            i != iend; ++i )
    {
        std::cout << i->get<place  >() << ") "
                  << i->get<country>() << std::endl;
    }

    std::cout << std::endl
              << "Countries names ordered alphabetically along with"
                 "their final position:"
              << std::endl;

    for( results_bimap::map_by<country>::const_iterator
            i    = results.by<country>().begin(),
            iend = results.by<country>().end() ;
            i != iend; ++i )
    {
        std::cout << i->get<country>() << " ends "
                  << i->get<place  >() << "º"
                  << std::endl;
    }

    return 0;
}

答案 1 :(得分:1)

您可以使用boost::multi_index提供两种不同的查找机制(以下是使用multi_index的bidirectional map示例)。另一个(可能更简单)选项是维护两个容器:一个按顺序查找,一个按字符串搜索。您可以使用两个std::mapstd::map和一个std::vector(用于常规查找常规)。

  

顺便说一句,是否可以拥有一个恒定的STL容器?我只需要搜索功能,而不是插入。

是的,但您必须初始化非const容器。然后,您可以将其复制到const容器中。例如,您可以使用辅助函数:const std::map<string, int> ordinals = create_map();

  

也就是说,标题可以简单地说:...

不,您应该在适当的控制流程内初始化容器。