C++ 从向量中查找字符串的第一个匹配项<;字符串>;

C++ 从向量中查找字符串的第一个匹配项<;字符串>;,c++,boost,std,C++,Boost,Std,我有一个向量向量字符串,其值为:ta、bc、ac、st、cer、cda。我想在输入字符串中找到向量中任何字符串的第一个匹配项 e、 g 在向量中给定的字符串中,我想用一种方式说,“cer”第一次出现在位置5 int min=9999999; 先串; 对于(int i=0;i

我有一个
向量向量字符串
,其值为:
ta、bc、ac、st、cer、cda
。我想在输入字符串中找到向量中任何字符串的第一个匹配项

e、 g

在向量中给定的字符串中,我想用一种方式说,
“cer”
第一次出现在位置
5


int min=9999999;
先串;
对于(int i=0;i
这个实现是可行的,但我想知道是否有一种更优雅的方法可以使用boost库或std库来实现这一点


我正在Windows上工作并使用Visual Studio 2010。

我不知道此任务的通用boost算法。 您的算法是正确的,在小尺寸上应该可以很好地工作。如果字符串向量较大,则可能需要使用更复杂的树结构来完成此任务。例如,可以将字符串向量组织到树中以加快搜索速度。
您也可以使用后缀树。

这是一个MapReduce问题

首先,您希望从
向量
向量
,它们的位置是一个映射,然后您希望将值按其最小值减少到一个值,这是一个减少。首先是地图。这是
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);
    }
);
要查找在那里找到的字符串,只需简单的迭代器算术:

string found = stuff[iterator - positions.begin()];
类查找
{
公众:
std::向量字符串;
地图位置;
大小\u t查找(标准::字符串str)
{
for(std::vector::iterator i=vectorStrings.begin();
i!=向量字符串.end();
++(一)
{
位置[str.find(*i)]=*i;
}
return(*(positions.begin())。首先;
}
};

我不知道优雅,但我认为外部循环应该覆盖字符串字符,而内部循环(在您的例子中是-find)应该覆盖向量中的字符串。我认为这样会更有效率,你可以使min
string::size\u type min=string::npos(这也可以让您摆脱
pos==npos
测试)。您可以使用迭代器只是为了做到这一点,我试着写一个C++03非boost等价物。在我将用于
find
的成员函数指针组合在一起后,我记得
mem\u fun\u ref
仅适用于一元函数。以防万一OP也会这样做。
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);
    }
);
auto iterator = std::min_element(positions.begin(), positions.end());
int index = *iterator;
string found = stuff[iterator - positions.begin()];
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;
    }
};