C++;标准库转发列表问题 我需要一些帮助来解决C++ 9.28底版第五版中的练习题。任务如下:

C++;标准库转发列表问题 我需要一些帮助来解决C++ 9.28底版第五版中的练习题。任务如下:,c++,c++11,c++-standard-library,forward-list,C++,C++11,C++ Standard Library,Forward List,编写一个函数,该函数接受前向列表并 另外两个字符串参数。函数应该找到第一个字符串 并在第一个之后插入第二个。如果第一个字符串是 找不到,然后在列表末尾插入第二个字符串 我无法理解书中所写的“转发列表”是如何工作的,以及为什么我们确实需要它,所以我请求帮助。下面是我写的代码,它是不完整的,我需要有人帮我完成它: #include <iostream> #include <forward_list> using namespace std; void find_and_i

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

我无法理解书中所写的“转发列表”是如何工作的,以及为什么我们确实需要它,所以我请求帮助。下面是我写的代码,它是不完整的,我需要有人帮我完成它:

#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;
}
#包括
#包括
使用名称空间std;
无效查找和插入(转发列表和flstr、常量字符串和指针、常量字符串和rplc){
自动电流=flstr.begin();
auto last=flstr.end();
bool-found=false;
while(curr!=上次){
如果(*电流==针){
发现=真;
//在这里放什么?!
打破
}
//放什么在这里?!。。。
++咖喱;
}
用于(常量自动和元素:flstr){

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


由于
std::forward_list::iterator
是一个复杂的元素,因此在末尾插入一个元素。幸运的是,我们有一个在开始之前返回迭代器1的元素。您可以捕获该迭代器,并且每次递增
curr
时,您也会递增该迭代器。一旦循环结束ver check查看
found
是否为
true
。如果为true,则可以在开始迭代器之前使用该1,因为它现在指向最后一个元素。您将使用字符串将其传递到
insert_after
,就像在while循环中一样。

可以在开始之前使用成员函数
以以下方式编写函数gin

#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;
}    

这是forward_list的文档:让我们知道您到底不了解什么,我们会提供帮助。好的。我会查看文档。谢谢Sergeya,您实际上不需要检查
found
。迭代器始终可以用作插入位置。因为要求说,如果找不到值,新元素nt应该添加在末尾。@5gon12eder如果我们没有检查发现,我们如何知道它没有插入列表中?按照我阅读需求的方式,在这种情况下,函数将插入一个副本。@5gon12eder找到第一个字符串,并在第一个字符串之后插入第二个字符串。如果找不到第一个字符串,则插入se列表末尾的cond字符串。看起来只有在找不到第一个字符串时才将其放在末尾。是的,但您总是插入。如果找到第一个字符串,则立即在该位置后插入。如果找不到,则在末尾插入。您只需记住查找的最后一项之前的位置即可我不明白你为什么需要一个额外的标志。它是有效的,但我一开始有点难以理解=)。谢谢你的努力,弗拉德!
zero 
zero two 
zero one two 
zero one two three 
zero one two three four