如何引用?
using namespace std::list;
#include <list>
如何宣告一個型態為 T 的 list?
list <T> listT;
list <T *> listTP;
如何將資料置入?
class T {
public:
T ();
};
list <T> listT;
list <T *> listTP;
...
T f, b;
listT.push_back (b); // 將 b 複製丟到 listT 後面
listT.push_front (f) // 將 f 複製丟到 listT 前面
listTP.push_back (&b); // 將 b 的 address value 複製丟到 listT 後面
listTP.push_front (&f); // 將 f 的 address value 複製丟到 listT 前面
如何對 list 使用 for 回圈?
for (list <char *>::iterator i = listString.begin ();
i != listString.end (); i++)
printf ("%s\n", *i);
如果在 for 回圈裡面要移除一份資料呢?
for (list <char *>::iterator i = listString.begin ();
i != listString.end (); i++) {
...
delete *i;
*i = NULL;
// 千萬不可寫 listString.erase (i) 或者 listString.remove (*i)
// 要不然得馬上 break,否則 i 的值馬上變成無效值
// i++ 就會出問題
}
// 但是這樣子還沒有結束,得清除 data 為 NULL 的 node
listString.remove ((char *)NULL);
如果清除整個 link 的資料呢?
// 如果 list 裡面所指向的資料還不需要清除,下面的 for 回圈可以省去
// 基本上指標型態的 list 存的資料只是一些指向這些資料實體的指標而已
for (list <char *>::iterator i = listString.begin ();
i != listString.end (); i++)
delete *i;
listString.clear ();
如果你經常會在 list 中移除資料,該怎麼寫?
void fun1 (list <char *> &listString)
{
for (list <char *>::iterator i = listString.begin ();
i != listString.end (); i++) {
if (!*i)
continue;
...
if (...) {
delete *i;
*i = NULL;
continue;
}
...
}
// 這裡不可以使用 listString.remove ((char *)NULL);
// 因為有可能使外面呼叫的指位器消失
}
...
for (list <char *>::iterator i = listString.begin ();
i != listString.end (); i++) {
if (!*i)
continue;
...
fun1 (listString); // 可能會在裡面動到 listString
if (!*i)
continue;
}
// 只能在確定不會影響到其他同樣指到 listString 的 iterator (指位器)
// 的情況下移除內容為 NULL 的指位器
listString.remove ((char *)NULL);