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)应该覆盖向量中的字符串。我认为这样会更有效率,你可以使minstring::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;
}
};