我想制作一个字典程序,我的字典是用对实现的。我想在我的数组中搜索一个术语,并使用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相等的元素以及是否返回索引。我应该使用什么功能?
答案 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::map
或std::unordered_map