我需要一些帮助来解决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;
}
欢迎重构代码的任何建议!
答案 0 :(得分:2)
对于第一部分,您需要使用insert_after
。您将把当前迭代器传递给它并插入要插入的字符串,它将在当前元素之后插入该字符串。
至于在std::forward_list::iterator
处插入一个稍微复杂的元素是ForwardIterator。幸运的是,我们有before_begin
,它将在开始之前返回迭代器1。您可以捕获迭代器,每次增加curr
时也会增加迭代器。循环结束后,请检查found
是true
。如果是,则可以在开始迭代器之前使用该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