stl对和二进制搜索

时间:2016-07-20 16:01:49

标签: c++ stl

我想制作一个字典程序,我的字典是用对实现的。我想在我的数组中搜索一个术语,并使用stl函数返回所有这些的描述。我做了这个:

#include<iostream> 
#include<fstream>
#include<algorithm>
#include<string.h>
using namespace std;

bool compare(pair<string,string>a,pair<string,string>b) {
    return a.first<b.first;
}

int main() {
    pair<string,string> a[100]=pair<string,string>();
    int dimension=0;
    ifstream f("dictionar.in");
    string name,description;
    while(f>>name) {
        getline(f,description);
        a[dimension]=make_pair(name,description);
        dimension++;
    }
    for(int i=0;i<dimension;i++)
        cout<<a[i].first<<" "<<a[i].second<<endl;

    sort(a,a+dimension,compare);
    cout<<endl;

    for(int i=0;i<dimension;i++)
        cout<<a[i].first<<" "<<a[i].second<<endl;
    string searchelem;

    cin>>searchelem;
}

我想使用&#39; searchelement&#39;查找对数组中是否存在与searchelement相等的元素以及是否返回索引。我应该使用什么功能?

2 个答案:

答案 0 :(得分:5)

使用std::map。地图通常称为关联数组字典

您可能想要分解键和值并使用 trie 数据结构。 trie 允许更有效的查找(按字长)。

答案 1 :(得分:2)

您可以使用std::equal_range实现二进制搜索:

string searchelem;
cin>>searchelem;
auto p = std::equal_range( a,a+dimension,compare);
if( p.first == p.second ) {
    // not found
else
    std::cout << "for " << searchelem << " found " << p.first->second << std::endl;

你也可以使用std::lower_bound,但是你需要检查密钥是否相等,因为它返回的第一个元素不小于key。

您的代码可能有问题(与std::map不同) - 如果它们碰巧在文件中,它会保留重复项。您可以使用std::remove_if删除它们,但只使用std::mapstd::unordered_map

更简单,更简洁