1.list容器簡介
list是序列容器,允許在序列中的任何位置執(zhí)行固定O(1)時間復雜度的插入和刪除操作,并在兩個方向進行迭代。list容器是一個雙向循環(huán)鏈表。
- list容器與vector容器區(qū)別:
list中空間是隨機的,通過指向域保存下一個成員地址;vector容器空間是連續(xù)的;
list容器數(shù)據(jù)插入和刪除方便,能合理的利用空間;vector容器則是沒法實時分配資源;
2.list容器構造函數(shù)
list容器構造函數(shù):
list p;//默認構造
list(begin,end);//區(qū)間賦值
list(int num,elem);//num個elem值
list(const list &p);//拷貝構造
取頭數(shù)據(jù):front()
取尾數(shù)據(jù):back();
互換成員swap();
使用示例:
#include
using namespace std;
#include
/*遍歷*/
void PrintList(const list& p, int flag)
{
if (flag == 1)//正向遍歷
{
cout < "正向遍歷:" < endl;
for (list::const_iterator ptr = p.begin(); ptr != p.end(); ptr++)
{
cout < *ptr < " ";
}
}
else //逆向遍歷
{
cout < "逆向遍歷:" < endl;
for (list::const_reverse_iterator ptr = p.rbegin(); ptr != p.rend(); ptr++)
{
cout < *ptr < " ";
}
}
cout < endl;
}
void test()
{
list lst;//默認構造
//尾插法
lst.push_back(100);
lst.push_back(200);
//頭插法
lst.push_front(300);
lst.push_front(400);
PrintList(lst, 1);
PrintList(lst, 0);
list lst2(lst.begin(), lst.end());//區(qū)間賦值
cout < "lst2第一個成員:" < lst2.front() < endl;
cout < "lst2最后一個成員:" < lst2.back() < endl;
cout < "tlst3" < endl;
list lst3(3, 666);//3個666
PrintList(lst3, 1);
list lst4(lst2);//拷貝構造
}
int main()
{
test();
system("pause");
}
3.list容器賦值與互換成員
list容器賦值:
重載運算符=: list& operator=(const list &p);
siggn(int num,elem);//num個elem
siggn(begin,end);//區(qū)間賦值
互換:
swap(list &p);
使用示例:
#include
using namespace std;
#include
void PrintList(const list& p)
{
for (list::const_iterator ptr = p.begin(); ptr != p.end(); ptr++)
{
cout < *ptr < " ";
}
cout < endl;
}
void test()
{
list lst;
for (int i = 10; i <= 30; i += 10)
{
lst.push_back(i);
}
list lst2 = lst;//直接賦值
cout < "lst2:" < endl;
PrintList(lst2);
list lst3;
lst3.assign(5, 666);
cout < "lst3:" < endl;
PrintList(lst3);
list lst4;
lst4.assign(lst3.begin(), lst3.end());//區(qū)間賦值
cout < "lst4:" < endl;
PrintList(lst4);
//互換元素
lst4.swap(lst);
cout < "lst4:" < endl;
PrintList(lst4);
cout < "lst:" < endl;
PrintList(lst);
}
int main()
{
test();
system("pause");
}
4.list容器設置和獲取大小
list容器也有獲取元素個數(shù)函數(shù)size()和設置元素個數(shù)函數(shù)resize(),但list容器不存在獲取容量capacity()。
檢查容器是否為空可以使用empty()函數(shù)。
list容器元素個數(shù):size()
指定元素個數(shù):resize(int num);
resize(int num,elem); 指定大小,超出用elem補齊
判斷容器是否為空:empty()
使用示例:
#include
using namespace std;
#include
void PrintList(const list& p)
{
for (list::const_iterator ptr = p.begin(); ptr != p.end(); ptr++)
{
cout < *ptr < " ";
}
cout < endl;
}
void test()
{
list lst;
//插入數(shù)據(jù)
lst.push_back("C++");
lst.push_back("list容器");
lst.push_back("學習");
lst.push_back("示例");
PrintList(lst);
cout < "list成員個數(shù):" < lst.size() < endl;
lst.resize(10, "c++");//指定大小
PrintList(lst);
cout < "list成員個數(shù):" < lst.size() < endl;
lst.resize(2, "c++");//指定大小
PrintList(lst);
cout < "list成員個數(shù):" < lst.size() < endl;
list lst2;
if (lst2.empty())
{
cout < "lst2容器為空" < endl;
}
}
int main()
{
test();
system("pause");
}
5.list容器插入與刪除
list容器中插入與刪除相關函數(shù)如下所示:
list插入:
push_back();尾插
push_front();//頭插入
insert(iterator pos,elem);//在指定位置插入elem
insert(iterator pos,n,elem);//在指定位置插入n個elem
insert(iterator pos,begin,endl);在指定位置插入一個區(qū)間
list刪除:
pop_back();//尾刪
pop_front();//頭刪除
erase(iterator pos);//刪除指定位置的內(nèi)容
erase(begin,end);//刪除區(qū)間內(nèi)容
clear();//刪除所有內(nèi)容
remov(elem);刪除容器中所有的elem
使用示例:
#include
using namespace std;
#include
class Person
{
public:
Person(string name, int age) :name(name), age(age) {
}
bool operator==(const Person &p);
string name;
int age;
};
ostream& operator<(ostream& cout, Person p)
{
cout < "姓名:" < p.name < "t年齡:" < p.age ;
return cout;
}
bool Person::operator==(const Person &p)
{
if (this-?>age == p.age && this->name == p.name)return true;
return false;
}
void PrintList(list& p)
{
for (list::iterator ptr = p.begin(); ptr != p.end(); ptr++)
{
cout < *ptr < endl;
}
}
void test()
{
Person p1("小王",18);
Person p2("小李", 18);
Person p3("小劉", 18);
Person p4("小林", 18);
Person p5("小郭", 18);
list lst;
lst.push_back(p1);
lst.push_back(p2);
lst.push_back(p3);
lst.push_back(p4);
lst.push_back(p5);
if (p1 == p1)
{
cout < "相等" < endl;
}
cout < "lst成員信息:" < endl;
PrintList(lst);
list::iterator ptr = lst.begin();
ptr++;
lst.insert(ptr, Person("it_阿水", 18));//從第一個位置插入數(shù)據(jù)
cout < "insert插入成員信息:" < endl;
PrintList(lst);
list lst2;
lst2.insert(lst2.begin(),lst.begin(), lst.end());//從頭插入?yún)^(qū)間數(shù)據(jù)
cout < "insert插入?yún)^(qū)間信息:" < endl;
PrintList(lst2);
ptr = lst2.begin();
for (int i = 0; i < 3; i++)ptr++;
lst2.insert(ptr, 3, p1);//指定位置插入3個成員
cout < "insert插入多個成員信息:" < endl;
PrintList(lst2);
cout < "list2元素個數(shù):" < lst2.size() < endl;
lst2.erase(lst2.begin());//刪除第一個位置的成員
lst2.pop_back();//刪除最后一個成員
cout < "list2元素個數(shù):" < lst2.size() < endl;
PrintList(lst2);
//lst2.remove(p1);
listlst3;
lst3.push_back(10);
lst3.push_back(10);
lst3.push_back(3);
lst3.push_back(10);
lst3.push_back(3);
lst3.remove(10);//刪除所以的10
for (list::iterator ptr = lst3.begin(); ptr != lst3.end(); ptr++)
{
cout < *ptr < " ";
}
cout < endl;
}
int main()
{
test();
system("pause");
}
6.list容器數(shù)據(jù)存取
由于list容器底層是通過雙向循環(huán)鏈表來實現(xiàn)的,成員空間都是通過指針域保存的,所以不支持[]和at()訪問成員。
list容器的迭代器不支持隨機訪問。
list容器數(shù)據(jù)存取:
back();//獲取最后一個元素
push_back();//從末尾插入
front();//獲取第一個元素
push_front();從頭插入
注意:由于list容器并不是一段連續(xù)的空間,所以不支持[]和at()訪問成員
list容器的迭代器不支持隨機訪問,但是雙向的
使用示例:
#include
using namespace std;
#include
void test()
{
list lst;
//插入數(shù)據(jù)
lst.push_back(10);
lst.push_front(20);
lst.push_back(30);
cout < "第一個元素:" < lst.front() < endl;
cout < "最后一個元素:" < lst.back() < endl;
list::iterator ptr = lst.begin();
ptr++;//支持往后
ptr--;//支持往前
//ptr += 3;錯誤,不支持隨機訪問
}
int main()
{
test();
system("pause");
}
7.list容器數(shù)據(jù)反轉(zhuǎn)與排序
list容器自帶排序函數(shù)sort(),默認是升序排序。
list容器反轉(zhuǎn):
reverse();//反轉(zhuǎn)(逆序)
list容器排序
sort();//成員函數(shù)
注意:所有不支持迭代器隨機訪問的容器都不能使用全局函數(shù)sort進行排序,一般該容器會自帶排序的成員函數(shù)
使用示例:
#include
using namespace std;
#include
void PrintList(list& p)
{
for (list::iterator ptr = p.begin(); ptr != p.end(); ptr++)
{
cout < *ptr < " ";
}
cout < endl;
}
bool mycompare(int v1, int v2)
{
return v1 > v2;
}
void test()
{
list lst;
lst.push_back(10);
lst.push_back(30);
lst.push_back(20);
lst.push_front(40);
lst.push_front(60);
lst.push_front(50);
PrintList(lst);
//反轉(zhuǎn)
lst.reverse();
cout < "lst反轉(zhuǎn)后" < endl;
PrintList(lst);
//排序
lst.sort();//默認是升序
cout < "從小到大排序:" < endl;
PrintList(lst);
//降序排序
lst.sort(mycompare);
cout < "從大到小排序:" < endl;
PrintList(lst);
}
int main()
{
test();
system("pause");
}
8.list容器自定義數(shù)據(jù)類型排序案例
Person數(shù)據(jù)保存每個用戶的姓名、年齡、身高,現(xiàn)在需要對年齡按升序排序,若年齡相同,則對按身高進行降序排序。
#include
using namespace std;
#include
class Person
{
public:
Person(string name, int age, int height) :name(name), age(age), height(height) {
}
string name;//姓名
int age;//年齡
int height;//身高
};
ostream& operator<(ostream& cout, Person p)
{
cout < "姓名:" < p.name < "t年齡:" < p.age < "t身高:" < p.height;
return cout;
}
void PrintList(list& p)
{
for (list::iterator ptr = p.begin(); ptr != p.end(); ptr++)
{
cout < *ptr < endl;
}
}
/*
按照年齡升序排序,年齡相同時按升高降序排序
*/
bool PersonCompare(Person& p1, Person& p2)
{
if (p1.age == p2.age)
{
return p1.height > p2.height;
}
return p1.age < p2.age;
}
void test()
{
list lst;
lst.push_back(Person("小王", 18, 170));
lst.push_back(Person("小劉", 18, 175));
lst.push_back(Person("小李", 23, 168));
lst.push_back(Person("小林", 20, 171));
lst.push_back(Person("小蔣", 18, 172));
lst.push_back(Person("小姜", 17, 176));
PrintList(lst);
cout < "排序后:" < endl;
lst.sort(PersonCompare);
PrintList(lst);
}
int main()
{
test();
system("pause");
}
-
函數(shù)
+關注
關注
3文章
4331瀏覽量
62609 -
容器
+關注
關注
0文章
495瀏覽量
22061 -
C++
+關注
關注
22文章
2108瀏覽量
73646
發(fā)布評論請先 登錄
相關推薦
評論