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

String vector's sort compare and delete

本文关键字:删除 比较 排序 向量 字符串      更新时间:2023-10-16

在c++中我有

vector < vector <string> > Kblist;

Kblist中有许多子句,clauses=kblist.size();的个数和Kblist侧的每个子句都是一个字符串型向量,句子中的每个单词都在Kblist[i]中被拆分。

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

您可以遍历每个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;
}

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

在您的场景中,最好使用std::multiset< vector <string> >和比较器,以您需要的方式比较std::vector<string>。这将为您提供一个排序的容器,其中包含相邻的重复值和便宜的插入/删除