2011-12-22 42 views
7

我有一個vector<string> vectorStrings與值:ta, bc, ac, st, cer, cda。我想要查找輸入字符串中矢量中任何字符串的第一次出現。找到第一個出現的字符串從一個向量<string>

例如

InputStr = "this certainly helps"; 

在載體中給出一個字符串,我會想辦法說"cer"5位置第一次出現。


int min = 9999999; 
string first; 

for(int i = 0; i < vectorStrings.size(); i++) 
{ 
    int pos = InputStr.find(vectorStrings[i]); 

    if(pos == string::npos) 
     continue; 

    if(pos < min) 
    { 
     min = pos; 
     first = vectorStrings[i]; 
    } 
} 

// values of min and first gives which string occurred first 
// and at the position of it in the input string 

這個實現的作品,但我想知道,如果存在一個更優雅的方式與Boost庫或std庫做到這一點。

我的工作在Windows和使用Visual Studio 2010

+0

我不知道優雅,但我認爲,外環應去了字符串和內部循環(在你的情況 - 查找)在你的向量中的字符串。我認爲這會更有效 – 2011-12-22 21:38:53

+1

你可以讓min'string :: size_type min = string :: npos;'(這也可能讓你擺脫'pos == npos'測試)。 – UncleBens 2011-12-22 21:46:28

+0

你可以使用迭代器。 ;) – 2011-12-22 22:14:41

回答

8

這是一個MapReduce問題。

首先,你想從vector<string>vector<int>,他們的位置,這是一個地圖,然後你想要減少值爲一個值的最小值,這是一個減少。首先,地圖。這是std::transform

std::vector<std::string> stuff; 
std::string input; 
// fill stuff and input 
std::vector<int> positions; 
std::transform(
    stuff.begin(), 
    stuff.end(), 
    std::back_inserter(positions), 
    [&](std::string& stuff) { 
     return input.find(stuff); 
    } 
); 

現在我們簡單地用std::min_element來得到最小的元素,即reduce。

auto iterator = std::min_element(positions.begin(), positions.end()); 
int index = *iterator; 

要查找,發現那裏的字符串,它的迭代算法的簡單一點:

string found = stuff[iterator - positions.begin()]; 
+0

只是爲了這樣做,我試圖編寫一個C++ 03 non-boost等價物。在我爲了'find'而調用成員函數指針後,我記得'mem_fun_ref'只適用於一元函數。以防萬一OP嘗試相同。 – pmr 2011-12-22 22:55:26

1

我不知道這個任務一般助推算法。 你的算法是正確的,應該在小尺寸上正常工作。如果你有很大的字符串向量,你可能想爲這個任務使用更復雜的樹結構。例如,您可以將字符串矢量組織到樹中以加快搜索速度。 你也可以使用後綴樹。

1
class Find 
{ 
public: 
    std::vector<std::string> vectorStrings; 
    std::map<size_t, std::string> positions; 

    size_t find(std::string str) 
    { 
     for(std::vector<std::string>::iterator i = vectorStrings.begin(); 
      i != vectorStrings.end(); 
      ++i) 
     { 
      positions[str.find(*i)] = *i; 
     } 

     return (*(positions.begin())).first; 
    } 
}; 
相關問題