0

我正在尝试为这部分做一个循环:

    insert_front(&list,name[0]);
    insert_front(&list,name[1]);                 
    insert_front(&list,name[2]);

但是,我不知道哪个应该用作限制器,哪个应该停止循环,以及它将如何更改 name[] 周长。

这是整个代码:

#include "list.h"
#include "string"
using namespace std;
int main(){
    cout<<"What is your name \n";
    string name;
    getline(cin,name);

    Node *list;

    list = new_list();                          
    insert_front(&list,name[0]);
    insert_front(&list,name[1]);                  
    insert_front(&list,name[2]);
    }                          
    print_list(list);                                      
    delete_list(&list);
        print_list(list);
        return 0;

}
4

4 回答 4

6

迭代器版本(C++03):

for (std::string::iterator iter = name.begin(); iter != name.end(); ++iter)
    insert_front(&list, *iter);

Foreach 版本(C++11):

for ( char c : name)
    insert_front(&list, c);

索引版本(C++03):

for (size_t i = 0; i < name.size(); ++i)
    insert_front(&list, name[i]);

Foreach 版本(带有 Boost 的 C++03):

std::for_each(name.begin(), name.end(), boost::bind(insert_front, &list, _1));

我不太确定 C++11 foreach 版本。

如果您的手动编码列表具有迭代器,则可能还有一种合理的方式来使用 std::copy 或 std::transform 。

于 2012-09-11T22:56:14.677 回答
1

正如您所说,这并不是真正的“整个代码”。您的列表存储了哪些元素?看起来每个节点只有一个字符。因此,您似乎是在尝试创建一个字符列表来以相反的顺序表示该人的姓名。

既然如此:

for( size_t i = 0; i < name.length(); i++ ) {
    insert_front(&list,name[i]);
}
于 2012-09-11T22:55:43.757 回答
1

标准模板库(字符串是其中的一部分)提供了一些非常高效且安全的迭代器,用于处理您可能想要循环的项目。

for(string::iterator iter = name.begin(); iter < name.end(); iter++) {
    insert_front(&list, *iter);
}

string::begin显示了同样的例子。

string::begin() 返回一个对象,当使用 operator* 取消引用时,该对象给出其所在的值。operator++() 递增到下一个位置。string::end() 在字符串末尾给出另一个对象,以便 operator++() 之后的 operator==() 停止循环。

现在,重要的部分是您没有使用索引。许多 STL 容器允许您使用迭代器复制值。您甚至可以跳过 for 循环以使用 stl 列表并执行以下操作:

std::list list (name.begin(), name.end());

完毕。根本没有手动 for 循环或 for_each() 调用。您甚至可以使用 name.begin() + 1 跳过第一个字符。请参阅列表构造函数

正如评论中指出的,要实现 insert_front() 反转效果,应该是:

std::list list (name.rbegin(), name.rend());

string::rebgin() 和 string::rend() 以相反的顺序迭代。更简单地说,这是在使用 string::begin() 和 string::end() 分别引入反转之后出现的。

显然,您使用的是不同的列表,并且需要一些循环才能继续使用它。但是,您可能只是决定将字符串保留为字符串并将相关的迭代器传递给打印函数,并完全避免使用列表。这可能使您可以使代码足够通用,而不必关心它是来自字符串还是列表。

于 2012-09-11T23:02:06.560 回答
0

我认为您正在尝试这样做:

for(int i=0; i<name.size(); i++)
{
      insert_front(&list,name[i]);
}

这会将名称的每个字符存储在列表中。

于 2012-09-11T22:54:50.887 回答