• C++ find_end(STL find_end)算法详解

    find_end() 会在一个序列中查找最后一个和另一个元素段匹配的匹配项,也可以看作在一个元素序列中查找子序列的最后一个匹配项。这个算法会返回一个指向子序列的最后一个匹配项的第一个元素的迭代器,或是一个指向这个序列的结束迭代器。下面是一个示例:

    string text {"Smith, where Jones had had \"had\", had had \"had had\"." " \"Had had\" had had the examiners\' approval."};
    std::cout << text << std::endl;
    string phrase {"had had"};
    auto iter = std::find_end(std::begin(text), std::end(text), std::begin (phrase),std::end(phrase));
    if(iter != std::end(text))
    std::cout << "The last \"" << phrase<< "\" was found at index "<< std::distance (std::begin (text), iter) << std::endl;

    这段代码会从 text 中搜索“had had”的最后一个匹配项,并输出如下内容:

    Smith, where Jones had had "had", had had "had had" . "Had had" had had the examiners' approval.
    The last "had had" was found at index 63

    可以在 text 中搜索 phrase 的所有匹配项。在这个示例中只会记录匹配项的个数:

    size_t count {};
    auto iter = std::end(text);
    auto end_iter = iter;
    while((iter = std::find_end(std::begin(text), end_iter, std::begin(phrase), std::end(phrase))) != end_iter)
    {
        ++count;
        end_iter = iter;
    }
    std::cout << "\n\""<< phrase << "\" was found " << count <<" times." << std::endl;

    这个 while 循环表达式会进行这项搜索工作。循环表达式会在 [std::begin(text),end_iter) 这个范围内搜索 phrase。最开始的搜索范围包含 text 中的全部元素。为了说明这里发生了什么,下面用图 1 来演示这个过程。



    图 1 用 find_end() 反复搜索

更多...

加载中...