1

私は c++ を使用するのが初めてで、STL リストの使用方法がよくわかりません。街の通りの交差点のグラフを作っています。これが私の構造体/ヘッダーファイルです:

グローバル ヘッダー

#ifndef GLOBAL_H
#define GLOBAL_H

typedef struct Vertex_ vertex;
typedef struct Edge_ ege;

#endif

頂点ヘッダー

#ifndef VERTEX_H
#define VERTEX_H
 #include<list>
#include "global.h"
#include "edgelist.h"
struct Vertex_{
    int xsect;
    int danger;
    char xstreet[25];

    list<Edge_> EdgeList;
    struct Vertex_ *next;
    struct Vertex_ *prev;
};   

 #endif

エッジ ヘッダー

#ifndef EDGE_H
#define EDGE_H

#include "global.h"
#include "vertex.h"
struct Edge_{
    Vertex_ *adjvertex;
    int distance;

    struct Edge_ *next;
    struct Edge_ *prev;
};  

#endif

私のインストラクターは、c++ に関する注意事項を教えてくれなかったので、グラフの開始方法がよくわかりません。これが私がメインを開始する方法を考えていた方法です:

#include<iostream>
#include<list>
#include "vertex.h"
#include "edge.h"
#include "global.h"
int main(){
   list<Vertex_> xsection;
   list<Edge_> EdgeList;
}

別のファイルからデータをスキャンする必要があるため、リストのサイズが実際にはわかりません。問題は、リストのサイズを初期化する必要があるかどうか、またはイテレータを使用して何かを追加できるかどうかです。もう 1 つの問題は、このリストの要素内のデータにどのようにアクセスするかです。イテレータを使用するだけで、次のようになりますか?

*iter->EdgeList.begin(); 

STL リストのすべてのコマンドと関数、およびその使用方法を備えた Web サイトを誰かが持っている場合、それは素晴らしいことです。現在、これらのリストがどのように機能するかを確認するためだけに 10 の Web サイトを開いているからです。

4

1 に答える 1

4

リストのサイズを初期化する必要はありません。std::list.push_back()またはを使用して新しい要素をリストに追加できます。std::list.push_front()

リストのこのリンクが気に入っています: http://www.cplusplus.com/reference/list/list/

そして、これはすべてのために: http://www.cplusplus.com/reference/

cplusplus.com の良い点は、標準で定義されている場合、関数呼び出しの複雑さを指定していることです。

コメントでの質問について、 std は名前空間であり、追加することでインポートできるusing namespace std;ため、書く必要はありませんstd::list。C++ では、それぞれ独自のバージョンの を実装する複数の名前空間を持つことができますlist

list型の要素を含むテンプレート リストを意味しXます。std::listSTLリストです。

簡単な例を次に示します。

int main(void) {
    std::list<std::string> l;
    l.push_back("overflow");
    l.push_back("test");

    /* Access it through iterators */
    /* iterators are kinda like pointers, but each ++ moves to the next item */
    std::list<std::string>::iterator it;
    for(it = l.begin(); it != l.end(); it++) {
        std::cout << "item: " << *it << std::endl;
    }

    l.push_front("stack");
    std::cout << *l.begin() << std::endl;

}

そして、ここに作業中のコードがあります: http://ideone.com/R8sQhH

また、 struct を使用している場合:

struct test {
    string tmp;
};

void somefunction() {
    std::list<test> l;
    /* code */
    std::cout << (l.begin())->tmp << std::endl;
}

完全な構造体の例: http://pastebin.com/YETUq1xT

于 2012-12-04T18:48:26.983 に答える