在大字符串向量中查找较大的字符串向量

Find larger string vector in large string vector

本文关键字:字符串 向量 查找      更新时间:2023-10-16

在C++中,检查大小约为800000的字符串向量中的每个元素,看看它是否在另一个大小约为200000的字符串向量上,最快的方法(或体面的方法(是什么?我的目标是把在第二局中找到的第一局的所有弦都推到第三局。

我的初学者尝试永远不会停止运行:

vector<string> combosVsWords(vector<string> words, vector<string> lettercombos)
{
    vector<string> firstwords;
    for (int i = 0; i != lettercombos.size(); i++)
    {
        if (find(words.begin(), words.end(), lettercombos[i]) !=   words.end())
            firstwords.push_back(lettercombos[i]);
    }       
}

如果vectors可以排序,那么以下内容应该使用std::set_intersection:

#include <algorithm>
#include <vector>
#include <string>
#include <algorithm>
#include <iterator>
//...
using namespace std;
vector<string> combosVsWords(vector<string>& words, 
                             vector<string>& lettercombos)
{
    vector<string> firstwords;
    // Sort the vectors 
    sort(words.begin(), words.end());
    sort(lettercombos.begin(), lettercombos.end());
    // get the set intersection of the vectors and place
    // the result in firstwords
    set_intersection(words.begin(), words.end(), lettercombos.begin(), 
                     lettercombos.end(), back_inserter(firstwords));
    return firstwords;
}

您可以做的是将每个向量放入一个集合中,如:

std::set<std::string> setA (vectorA.begin(), vectorA.end()), setB (vectorB.begin(), vectorB.end());

然后得到集合的交集,如:

std::set<int> intersect;
set_intersection(setA.begin(),setA.end(),setB.begin(),setB.end(),
              std::inserter(intersect,intersect.begin()))

intersect中的值将是集合A和集合B中的重叠值。

这些问题可能也会有所帮助。如何将矢量转换为集合

如何设置交叉点