0

在 C++ 中我有

vector < vector <string> > Kblist;

里面Kblist有很多子句,clauses=kblist.size();side里面的每一个子句的个数Kblist都是一个字符串型的向量,句子里面的每一个词都在里面分割Kblist[i]

什么是最快的方法是在相同的单词中找到句子,如一个 in"I love you"和另一个 in"you love i"并从中删除这两个句子Kblist,我的代码可能正在运行,但我认为它太慢了,因为很多循环。所以我想知道有没有更好的解决方案,就像使用排序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);
4

2 回答 2

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;
}

std::find_if

// 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这不应该是一个大问题。

于 2013-04-23T13:08:11.943 回答
0

在您的场景中,最好使用std::multiset< vector <string> >比较器std::vector<string>以您需要的方式进行比较。这将为您提供具有相邻重复值和廉价插入/擦除的排序容器。

于 2013-04-23T13:16:04.710 回答