2015-07-05 2 views
-1

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

могли бы вы поместить каждый вектор в свой собственный набор STL и создать третий набор с помощью функции STL пересечения? –

+0

Честно говоря, я понятия не имею, что это значит, что я очень новичок в C++ и программировании вообще. edit: oh, стандартная библиотека, хм, позвольте мне немного изучить это. – Austin

+0

Если у вашего вектора, в котором вы проходите, есть так много строк, вы должны передать их своей функции по ссылке const, а не по значению. Во-вторых, можно ли отсортировать ваши слова и букмекомы? Если это так, то первым вариантом использования 'std :: set_intersection' будет выбор. – PaulMcKenzie

ответ

2

Если 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; 
} 
1

Что вы можете сделать это поместить каждый вектор в набор, такой как:

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

Затем получите набор 'inter раздел:

std::set<int> intersect; 

set_intersection(setA.begin(),setA.end(),setB.begin(),setB.end(), 
       std::inserter(intersect,intersect.begin())) 

Значения в пересечении будут являться перекрывающимися значениями из setA и setB.

Эти вопросы также могут помочь. How to convert a vector to a set

How to get set intersection