0

この部分のループを実行しようとしています:

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

しかし、どれをリミッターとして使用する必要があるのか​​ 、ループを停止する必要があるのか​​ 、それが名前[]境界をどのように変更するのかわかりません。

コード全体は次のとおりです。

#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

あなたが言うように、それは実際には「コード全体」ではありません。あなたのリストにはどのような要素が保存されていますか? ノードごとに 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_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 に答える