C ++标准库forward_list问题

时间:2016-01-28 14:22:41

标签: c++ c++11 c++-standard-library forward-list

我需要一些帮助来解决C ++ Primer第5版的练习9.28。这是任务:

  

编写一个带有forward_list和的函数   另外两个字符串参数。该函数应该找到第一个字符串   并在紧接第一个之后插入第二个。如果第一个字符串是   找不到,然后在列表末尾插入第二个字符串。

我无法理解书中关于forward_list实际如何运作以及为什么我们确实需要它的想法,所以我正在寻求帮助。下面是我写的代码不完整,我需要有人帮我完成它:

#include <iostream>
#include <forward_list>

using namespace std;

void find_and_insert(forward_list<string>& flstr, const string& needle, const string& rplc) {

    auto curr = flstr.begin();
    auto last = flstr.end();
    bool found = false;

    while (curr != last) {

        if (*curr == needle) {

            found = true;
            // what to put here?!
            break;
        }

        // what to put here?!... 
        ++curr;
    }

    for (const auto& elem : flstr) {

        cout << elem << endl;
    }

    return;
}

int main(int argc, char *argv[]) {

    cout << endl;

    forward_list<string> flstring = {"Foo", "Bar", "Baz", "Tomcat"};

    find_and_insert(flstring, "Bar", "Insertion");

    cout << endl;

    return EXIT_SUCCESS;
}

欢迎重构代码的任何建议!

2 个答案:

答案 0 :(得分:2)

对于第一部分,您需要使用insert_after。您将把当前迭代器传递给它并插入要插入的字符串,它将在当前元素之后插入该字符串。

至于在std::forward_list::iterator处插入一个稍微复杂的元素是ForwardIterator。幸运的是,我们有before_begin,它将在开始之前返回迭代器1。您可以捕获迭代器,每次增加curr时也会增加迭代器。循环结束后,请检查foundtrue。如果是,则可以在开始迭代器之前使用该1,因为它现在指向最后一个元素。您将使用字符串将其传递给insert_after,就像在while循环中一样。

答案 1 :(得分:1)

您可以使用成员函数before_begin

以下列方式编写函数
#include <iostream>
#include <forward_list>
#include <string>

void find_and_insert( std::forward_list<std::string> &lst, 
                      const std::string &src, 
                      const std::string &dest ) 
{
    auto before = lst.before_begin();
    auto first  = lst.begin();

    while ( first != lst.end() && *first != src ) ++before, ++first;

    lst.insert_after( first == lst.end() ? before : first, dest );
}

int main()
{
    std::forward_list<std::string> lst;

    find_and_insert( lst, "one", "zero" );

    for ( const std::string &s : lst ) std::cout << s << ' ';
    std::cout << std::endl;

    find_and_insert( lst, "zero", "two");

    for ( const std::string &s : lst ) std::cout << s << ' ';
    std::cout << std::endl;

    find_and_insert( lst, "zero", "one");

    for ( const std::string &s : lst ) std::cout << s << ' ';
    std::cout << std::endl;

    find_and_insert( lst, "two", "three");

    for ( const std::string &s : lst ) std::cout << s << ' ';
    std::cout << std::endl;

    find_and_insert( lst, "four", "four");

    for ( const std::string &s : lst ) std::cout << s << ' ';
    std::cout << std::endl;
}    

程序输出

zero 
zero two 
zero one two 
zero one two three 
zero one two three four