从向量<string> </string>中查找第一个字符串

时间:2011-12-22 21:18:09

标签: c++ boost std

我的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。

3 个答案:

答案 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;
    }
};