在C ++中我有
vector < vector <string> > Kblist;
在Kblist
内,有许多子句,clauses=kblist.size();
的数字和Kblist
边的每个子句都是字符串类型的向量,句子中的每个单词都被分成Kblist[i]
1}}。
在同一个单词中查找句子的最快方法是"I love you"
和"you love i"
中的另一个,并从Kblist
中删除这两个句子,我的代码可能是工作运行的但是我觉得它太慢了,因为很多人流传。所以我想知道有没有更好的解决方案,就像使用sort,clause1==clause2
或其他方法一样快。
for (int a=0; a<KBlist.size(); a++){
for (int b=a+1; b<KBlist.size(); b++){
int checksize=0;
if (KBlist[a].size()==KBlist[b].size()) {
for (int c=0; c<KBlist[a].size(); c++){
for (int d=0; d<KBlist[b].size(); d++){
if (KBlist[a][b]==KBlist[c][d]&&KBlist[a][b+1]==KBlist[c][d]) {
checksize=checksize+1;
break;
}
}
}
if (checksize==c.size()) {
inset=1;
break;
}
}
}
}
}while (duplicate==0);
答案 0 :(得分:0)
您可以迭代每个std::vector
并使用标准库的算法。
有std::find
// find example
#include <iostream> // std::cout
#include <algorithm> // std::find
#include <vector> // std::vector
int main () {
int myints[] = { 10, 20, 30 ,40 };
int * p;
// pointer to array element:
p = std::find (myints,myints+4,30);
++p;
std::cout << "The element following 30 is " << *p << '\n';
std::vector<int> myvector (myints,myints+4);
std::vector<int>::iterator it;
// iterator to vector element:
it = find (myvector.begin(), myvector.end(), 30);
++it;
std::cout << "The element following 30 is " << *it << '\n';
return 0;
}
// find_if example
#include <iostream> // std::cout
#include <algorithm> // std::find_if
#include <vector> // std::vector
bool IsOdd (int i) {
return ((i%2)==1);
}
int main () {
std::vector<int> myvector;
myvector.push_back(10);
myvector.push_back(25);
myvector.push_back(40);
myvector.push_back(55);
std::vector<int>::iterator it = std::find_if (myvector.begin(), myvector.end(), IsOdd);
std::cout << "The first odd value is " << *it << '\n';
return 0;
}
当您使用std::string
时,这不应该是一个大问题。
答案 1 :(得分:0)
在您的方案中,最好将std::multiset< vector <string> >
与比较器一起使用,以便以您需要的方式比较std::vector<string>
。这将为您提供彼此相邻且具有重复值的已排序容器以及便宜的插入/擦除。