2013-03-01 13 views
5

私はリストstd::list<T *> *l;を持っています。このリストはnullではなく、いくつかの値を持ちます。私の問題は、アイテムに正しくアクセスする方法ですか?私はリストを反復する必要はありません。私はちょうど最初のアイテムがほしいです。std :: listの最初の要素にアクセスするには?

std::list<T*>::iterator it = l->begin(); 

if (it != l->end()) 
{ 
    // accessing T 
    int value = (*it)->value(); // Is this safe? 
} 

また、nullをチェックする必要がありますか?

if (it != l->end() && (*it)) 
{ 
    // accessing T 
    int value = (*it)->value(); 
} 
+0

あなたはポインタを保持しているので、 'NULL'を確認してください。あるいは 'std :: list 'を使ってください。 – juanchopanza

+3

'std :: list 'の代わりに 'std :: list 'を使うことにしたのはなぜですか? – LihO

+0

生ポインタを使用することは本当に必要ですか? –

答えて

8

あなたがstd::list<T*> myList;を使用してのはTは次のように定義されていることを言わせすることを余儀なくされている場合は、次の

struct T 
{ 
    T(const char* cstr) : str(cstr){ } 
    std::string str; 
}; 

そしてちょうど最初の要素にアクセスするためにstd::list::frontを使用します。

std::string firstStr = myList.front()->str; 

(注)この場合myList.front()戻っていますリストの最初の要素への参照です。この場合、ポインタを参照しています。したがって、最初の要素へのポインタのように扱うことができます。

NULLについての質問:ポインタのコンテナで作業するときは、オブジェクトが破棄されたらポインタをコンテナから削除する必要があります。ポインタの使用を開始すると、通常は、ポインタが指し示すオブジェクトに接続されたメモリ管理の責任者になっていることを意味します(std::list<T>を常に可能な限りstd::list<T*>より優先させる主な理由です)。

NULLポインタがダングリングポインタよりもさらに悪いこと:あなたがオブジェクトを作成すると、お使いの容器にそのアドレスを格納し、そのオブジェクトが破壊されたら、あなたのコンテナからこのアドレスを削除しないであろう、そしてこのポインタますこのポインタが指し示すメモリにアクセスしようとすると、の未定義の動作が生成されます。そのため、std::listにポインタNULLが含まれていないことを確認するだけでなく、有効なオブジェクトへのポインタがまだ存在することを確認する必要があります。

ですから、これらの要素をクリーンアップされます時間によって、あなた自身があなたのリストからポインタを削除し、それらを一度にポイントオブジェクトを削除見つける:

std::list<T*> myList; 

myList.push_back(new T("one")); 
myList.push_back(new T("two")); 
myList.push_back(new T("three")); 
myList.push_back(new T("four")); 

while (!myList.empty()) 
{ 
    T* pT = myList.front();      // retrieve the first element 
    myList.erase(myList.begin());    // remove it from my list 
    std::cout << pT->str.c_str() << std::endl; // print its member 
    delete pT;         // delete the object it points to 
} 

また、これらの質問を読んで価値がある:
Can you remove elements from a std::list while iterating through it?
Doesn't erasing std::list::iterator invalidates the iterator and destroys the object?

+0

isfront()現在削除されている関数ですか?もしそうなら、代わりに何を使うべきですか? – serup

0

リスト要素のヌルチェックの必要性は、まず最初にリストに入れることができるものによって決まります。

リストにNULLポインタが含まれている可能性がある場合は、要素にアクセスする前にNULLを確認する必要があります。
可能でない場合は、チェックする必要もありません。

+0

私は、特にDEBUG /開発ビルドでは、NULLをチェックする必要があります。 NULLではないと思われる場合は、例外をスローします。 –

+0

@AlexChamberlain:その場合、ポインタが依然として有効な有効オブジェクトを参照していることも確認してください。 –

+0

私は方法を考えることができれば、私はDEBUGビルドになります。 –

関連する問題