list(链表)由一系列结点组成,每个结点包含指针域和数据域,STL中的链表实质上是一个双向循环链表;
list 容器常用的构造方式如下:
list
lst; // lst采用模板类实现,为对象的默认构造形式 list(beg, end); // 构造函数将[beg, end)区间的元素拷贝到容器中
list(n, elem); // 构造函数将 n 个 elem 拷贝到容器中
list(const list &lst); // 拷贝构造函数
代码实例:
#include
#include void printList(const std::list& L){for (std::list::const_iterator it = L.begin(); it != L.end(); it++){std::cout << *it << " ";}std::cout << std::endl;
}int main(int argc, char* argv[]){// 默认构造函数std::list lst1;lst1.push_back(10);lst1.push_back(20);lst1.push_back(30);lst1.push_back(40);printList(lst1);// 区间构造函数std::list lst2(lst1.begin(), lst1.end());printList(lst2);// n个elem构造函数std::list lst3(4, 100);printList(lst3);// 拷贝构造函数std::list lst4(lst1);printList(lst4);return 0;
}
通过以下函数实现对 list 容器的赋值和交换:
assign(beg, end); // 将[beg, end)区间中的数据拷贝赋值到容器中
assign(n, elem); // 将 n 个 elem 拷贝赋值给容器
list& operator=(const list &list); // 重载等号操作符
swap(lst); // 将lst和容器的元素进行互换
代码实例:
#include
#include void printList(const std::list& L){for (std::list::const_iterator it = L.begin(); it != L.end(); it++){std::cout << *it << " ";}std::cout << std::endl;
}int main(int argc, char* argv[]){std::list lst1;lst1.push_back(10);lst1.push_back(20);lst1.push_back(30);lst1.push_back(40);printList(lst1);std::list lst2;lst2.assign(lst1.begin(), lst1.end());printList(lst2);std::list lst3;lst3.assign(4, 100);printList(lst3);std::list lst4;lst4 = lst1;printList(lst4);// before changestd::cout << "before change: " << std::endl;printList(lst1);printList(lst3);lst1.swap(lst3);std::cout << "after change: " << std::endl;printList(lst1);printList(lst3);return 0;
}
通过以下函数实现对 list 容器的大小操作:
size(); // 返回容器中元素的个数
empty(); // 判断容器是否为空
resize(num); // 重新指定容器的长度为 num,若容器变长则以默认值0填充,若容器变短则多余的元素会被删除
resize(num, elem); // 重新指定容器的长度为 num,若容器变长则以 elem 值填充,若容器变短则多余的元素会被删除
代码实例:
#include
#include void printList(const std::list& L){for (std::list::const_iterator it = L.begin(); it != L.end(); it++){std::cout << *it << " ";}std::cout << std::endl;
}int main(int argc, char* argv[]){std::list lst1;lst1.assign(4, 10);printList(lst1);if(lst1.empty()){std::cout << "The list is empty !" << std::endl;}else{std::cout << "Num data of list: " << lst1.size() << std::endl;lst1.resize(2);printList(lst1);lst1.resize(4);printList(lst1);lst1.resize(10, 1);printList(lst1);}return 0;
}
通过以下函数实现瑞容器数据的插入和删除:
push_back(elem); // 在容器尾部插入一个元素
pop_back(); // 删除容器中最后一个元素
push_front(elem); // 在容器开头插入一个元素
pop_front(); // 在容器开头移除第一个元素
insert(pos, elem); // 在pos位置插如elem元素,返回新数据的位置
insert(pos, n, elem); // 在pos位置插入n个elem元素,没有返回值
insert(pos, beg, end); // 在pos位置插入[beg, end)区间的数据,没有返回值
clear(); // 移除容器的所有数据
erase(beg, end); // 删除[beg, end)区间的数据,返回下一个数据的位置
erase(pos); // 删除pos位置的数据,返回下一个数据的位置
remove(elem); // 删除容器中所有与elem值匹配的元素
实例代码:
#include
#include void printList(const std::list &L){for(std::list::const_iterator it = L.begin(); it != L.end(); it++){std::cout << *it << " ";}std::cout << std::endl;
}void test1(){std::list l1;// 头插 和 尾插l1.push_back(10);l1.push_back(20);l1.push_back(30);l1.push_front(300);l1.push_front(200);l1.push_front(100);printList(l1);// 尾删和头删l1.pop_back();l1.pop_front();printList(l1);// insert插入std::list::iterator it = l1.begin();l1.insert(++it, 1000);printList(l1);// 删除it = l1.begin();l1.erase(++it);printList(l1);l1.push_back(10000);l1.push_back(10000);printList(l1);l1.remove(10000);printList(l1);
}int main(int argc, char *argv[]){test1();return 0;
}
list 容器不支持随机访问,可通过以下接口访问数据:
front() // 返回第一个数据
back() // 返回最后一个数据
代码实例:
#include
#include int main(int argc, char *argv[]){std::list lst1;lst1.push_back(10);lst1.push_back(20);lst1.push_back(30);lst1.push_back(40);std::cout << lst1.front() << std::endl; // 第一个元素std::cout << lst1.back() << std::endl; // 最后一个元素// list容器不支持随机访问std::list::iterator it = lst1.begin();it++;it--;// it = it + 1; //错误std::cout << *it << std::endl;return 0;
}
通过以下接口实现 list 容器的反转和排序:
reverse(); // 实现容器的反转
sort(); // 实现容器的排序
// 注:所有不支持随机访问迭代器的容器,不可以使用标准算法;
// 不支持随机访问迭代器的容器,内部会提供相应的排序算法
代码实例:
#include
#include void printList(const std::list& L){for (std::list::const_iterator it = L.begin(); it != L.end(); it++){std::cout << *it << " ";}std::cout << std::endl;
}bool mycompare(int v1, int v2){return v1 > v2; // 降序 v1 > v2
}int main(int argc, char *argv[]){std::list lst1;lst1.push_back(10);lst1.push_back(30);lst1.push_back(20);lst1.push_back(40);printList(lst1);// 反转lst1.reverse();printList(lst1);// 默认升序lst1.sort();printList(lst1);// 降序lst1.sort(mycompare);printList(lst1);return 0;
}
对于自定义数据类型,使用排序操作时必须指定排序的规则:
#include
#include
#include class Person{
public:Person(std::string name, int age, int height){this -> name = name;this -> age = age;this -> height = height;}std::string name;int age;int height;
};void printList(const std::list &lst){for(std::list::const_iterator it = lst.begin(); it != lst.end(); it++){std::cout << "Name: " << (*it).name << ", Age: " << (*it).age << ", Name: " << (*it).height << std::endl;}
}bool myCompare(Person &p1, Person &p2){// 按照年龄升序if(p1.age == p2.age){// 年龄相同,身高降序return p1.height > p2.height;}else{return p1.age < p2.age;}
}int main(int argc, char *argv[]){std::list lst1;Person p1("Zhangsan", 25, 175);Person p2("Lisi", 25, 165);Person p3("Wangwu", 25, 178);Person p4("Zhaoliu", 30, 175);lst1.push_back(p1);lst1.push_back(p2);lst1.push_back(p3);lst1.push_back(p4);printList(lst1);std::cout << "After sort: " << std::endl;lst1.sort(myCompare);printList(lst1);return 0;
}
未完待续!