字符串向量的排序比较和删除

时间:2013-04-23 13:01:42

标签: c++ sorting vector compare

在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);

2 个答案:

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

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

答案 1 :(得分:0)

在您的方案中,最好将std::multiset< vector <string> >与比较器一起使用,以便以您需要的方式比较std::vector<string>。这将为您提供彼此相邻且具有重复值的已排序容器以及便宜的插入/擦除。