c++存储键与字符串在树?汇总

C++ Store Keys with String in tree? Rollup

本文关键字:汇总 字符串 存储 c++      更新时间:2023-10-16

我需要存储映射到模型的模型的数字。例如:

    1:99:54:42 -> Black Tea -> /models/liquid/tea/blacktea.model
    1:99:54:43 -> Green Tea
    1:99:53:1  -> normal Coffee

我不能改变数字。如果没有绿茶的模型,我只想找一个模型,任何茶,像:1:99:54:*.

我的解决方案是存储所有存在的映射模型,所以如果没有等效的模型,我不会将绿茶存储到像树一样的结构中。因此,如果给定的数字不存在,我可以很容易地查看所有子节点。

//编辑是的,有很多没有模型的钥匙。我只想加载键与模型在某种类型的树,地图或列表。我需要搜索一个模型,直到我采取默认0:0:0:0。应该是某种Rollup,从1:xc:ys:zz到1:::*

如果您将条目存储在以数字为键的std::map中-包括那些没有模型的-那么您可以使用lower_bound搜索键并上下迭代以找到具有模型的最接近的键…应该是相当有效的,除非您有一个特别长的无模型键运行,在这种情况下,您可能想要保留第二个set,只有具有模型的键—lower_bound可以为您提供一个附近的键,您可以在实际键周围比较两个键,看看哪个在数字上更好。还有进一步的索引/优化机会,但这取决于你是一次填充数据然后重复搜索,还是继续在搜索中进行插入和删除。

例如:

struct Tea { string name_; string model_; };
std::map<string, Tea> number_to_tea;
std::set<string> numbers_with_models;
// when inserting...
if (!tea.model_.empty())
    numbers_with_models.insert(number);
number_to_tea[number] = tea;
// when searching...
if (numbers_with_models.empty())
     return/break/whatever...
auto i = numbers_with_models.lower_bound(number);
if (i != numbers_with_models.end())
    if (i.first == number) // perfect match...
        // ...
    else if (i == numbers_with_models.begin())
        // closet element is first element... do whatever...
    else
    {
        if (i.first - number < number - std::prev(i).first)
            // following element is closer...
        else
            // previous element is closer...
    }
else
    // last element is closest...