我正在尝试构建一个由序数字符串表示的容器,可以通过字符串和数字进行搜索。例如,我可以通过数组来轻松地完成它,但效率很低:
std::string ordinalStrings = {"zeroth", "first", "second",..}
使用ordinalStrings [number]获取字符串,使用while(未找到)循环获取整数,但我认为其中一个STL容器会做得更好,只是不确定哪一个。
两者都无法搜索,例如,简单地使用字符串键获取地图的数字键就行了,但似乎没有它的功能,而且,它似乎有点凌乱。
顺便说一句,是否可以拥有一个恒定的STL容器?我只需要搜索功能,而不是插入。此外,由于我认为我不能,是否可以在没有初始化函数的情况下填充容器?也就是说,标题可以简单地说:
std::map<std::string, int> ordinals;
ordinals["zero"] = 0;
ordinals["one"] = 1;
...
对于基本上是常数值的初始化函数来说,似乎很愚蠢;
谢谢, 悦
答案 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::map
或std::map
和一个std::vector
(用于常规查找常规)。
顺便说一句,是否可以拥有一个恒定的STL容器?我只需要搜索功能,而不是插入。
是的,但您必须初始化非const容器。然后,您可以将其复制到const
容器中。例如,您可以使用辅助函数:const std::map<string, int> ordinals = create_map();
也就是说,标题可以简单地说:...
不,您应该在适当的控制流程内初始化容器。