【问题标题】:Find larger string vector in large string vector在大字符串向量中查找更大的字符串向量
【发布时间】:2015-09-22 11:38:03
【问题描述】:

在 C++ 中,检查大小约为的字符串向量中的每个元素的最快方法(或体面方法)是什么? 800,000 看看它是否在另一个大约的字符串向量中。大小 200,000?我的目标是将在第二个中找到的所有第一个字符串推入第三个。

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

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

【问题讨论】:

  • 你能不能把每个向量放到它自己的 STL 集合中,然后使用 STL 交集函数创建第三个集合?
  • 老实说,我不知道这意味着我对 C++ 和一般编程非常陌生。编辑:哦,标准库,嗯,让我研究一下。
  • 如果你传入的向量有很多字符串,你应该通过常量引用而不是值将它们传递给你的函数。其次,可以对你的单词和字母组合进行排序吗?如果是这样,那么使用std::set_intersection 的第一个建议将是一个选项。
  • 我只是把const放在前面吗?希望这不是指针之类的事情,因为我还没有到那些。是的,排序没问题。我去看看交集函数。
  • @AustinMW Hopefully that's not a pointer sort of thing 你问“最快的方法是什么”。没有其他任何东西说明您可以使用或不能使用什么。无论如何,我发布了一个答案,如果可以对向量进行排序,一种获得两个向量交集的方法。

标签: c++ vector find large-data


【解决方案1】:

如果可以对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;
}

【讨论】:

    【解决方案2】:

    你可以做什么将每个向量放入一个集合中:

    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 中的值将是来自 setA 和 setB 的重叠值。

    这些问题也可能有所帮助。 How to convert a vector to a set

    How to get set intersection

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-12
      • 2011-03-20
      • 2023-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多