我的vector<string> vectorStrings
值为ta, bc, ac, st, cer, cda
。我想在输入字符串中找到向量中第一个出现的字符串。
e.g。
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 :(得分: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()];
答案 1 :(得分:1)
我不知道这项任务的通用增强算法。 您的算法是正确的,并且应该在小尺寸上正常工作。如果您有大型字符串向量,则可能需要为此任务使用更复杂的树结构。例如,您可以将字符串向量组织到树中以加快搜索速度。 你也可以使用后缀树。
答案 2 :(得分: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;
}
};