标签:删除元素 lis first 初始化 定义 near temp amp 有序列表
list是C++标准模版库(STL,Standard Template Library)中的部分内容。实际上,list容器就是一个双向链表,可以高效地进行插入删除元素。
使用list容器之前必须加上STL的list容器的头文件:#include<list>
list属于stl所以使用前要加 using std::list; (或者直接全局:using namespace std;)
Iterators:
Capacity:
Element access:
Modifiers:
Operations:
Observers:
下面对几个常用的操作举例:
1.构建及初始化
// 创建实例以及赋值 #include <iostream> #include <list> using namespace std; int main () { //第一种,通过构造函数 int myints[] = {75,23,65,42,13}; list<int> mylist1(myints, myints+5); list<int> mylist2(2,100); // 2个值为100的元素 //第二种,用push_back,或push_front for (int i = 1; i <= 5; ++i) mylist1.push_back(i); mylist2.push_front (200); mylist2.push_front (300); //第三种,用assign list<int> first; list<int> second; first.assign(7,100); // 给first添加7个值为100的元素 second.assign(first.begin(), first.end()); // 复制first给second int myints[] = {16, 8, 4}; first.assign (myints, myints + 3); // 将数组myints的内容添加给first //第四种,见insert函数 return 0; }
2.迭代器的创建及使用迭代器遍历
//list的遍历 #include <iostream> #include <list> using namespace std; int main () { int myints[] = {75,23,65,42,13}; list<int> mylist (myints,myints+5); cout << "mylist contains:"; //这是正序输出: for (list<int>::iterator it = mylist.begin(); it != mylist.end(); ++it) cout << ‘ ‘ << *it; cout << ‘\n‘; //使用c++11和c++14的新特性auto更加方便准确 auto it = mylist.begin(); list.clear(); //逆序输出: for (int i = 1; i <= 5; ++i) mylist.push_back(i); cout << "mylist backwards:"; for (list<int>::reverse_iterator rit = mylist.rbegin(); rit != mylist.rend(); ++rit) cout << ‘ ‘ << *rit; cout << ‘\n‘; return 0; } 输出结果为: mylist contains: 75 23 65 42 13 mylist backwards: 5 4 3 2 1
3.获取列表信息
// list::assign #include <iostream> #include <list> using namespace std; int main () { list<int> first; list<int> second; first.assign(7,100); // 给first添加7个值为100的元素 second.assign(first.begin(), first.end()); // 复制first给second int myints[] = {16, 8, 4}; first.assign (myints, myints + 3); // 将数组myints的内容添加给first cout << "Size of first: " << int (first.size()) << ‘\n‘; cout << "Size of second: " << int (second.size()) << ‘\n‘; return 0; } 输出结果为: Size of first: 3 Size of second: 7
2.push和pop添加元素
因为list是双向的所有总共有push_front ,push_back ,pop_front,po_back四种
#include <iostream> #include <list> using namespace std; int main () { list<int> mylist (2,100); // 2个值为100的元素 // list::push_front mylist.push_front (200); mylist.push_front (300); cout << "mylist contains:"; for (list<int>::iterator it = mylist.begin(); it != mylist.end(); ++it) cout << ‘ ‘ << *it; cout << ‘\n‘; // list::pop_front cout << "Popping out the elements in mylist:"; while (!mylist.empty()) { cout << ‘ ‘ << mylist.front(); mylist.pop_front(); } cout << "\nFinal size of mylist is " << mylist.size() << ‘\n‘; // list::push_back int myint; cout << "Please enter some integers (enter 0 to end):\n"; do { cin >> myint; mylist.push_back (myint); } while (myint); cout << "mylist contains:"; for (list<int>::iterator it = mylist.begin(); it != mylist.end(); ++it) cout << ‘ ‘ << *it; cout << ‘\n‘; // list::pop_back while (!mylist.empty()) { cout << ‘ ‘ << mylist.back(); mylist.pop_back(); } cout << "\nFinal size of mylist is " << mylist.size() << ‘\n‘; return 0; } 输出结果: mylist contai: 300 200 100 100 Popping out the elements in mylist: 300 200 100 100 Final size of mylist is 0 Please enter some integers (enter 0 to end): 23 8 5 6 0 mylist contains: 56 23 8 5 6 0 6 5 8 23 56 Final size of mylist is 0
3.insert插入新元素
// inserting into a list #include <iostream> #include <list> #include <vector> using namespace std; int main () { list<int> mylist; list<int>::iterator it; // 初始化 for (int i = 1; i <= 5; ++i) mylist.push_back(i); // 1 2 3 4 5 it = mylist.begin(); ++it; // 迭代器it现在指向数字2 ^ //在i0t指向的位置出插入元素10 mylist.insert (it,10); // 1 10 2 3 4 5 // "it" 仍然指向数字2 ^ //在it指向的位置出插入两个元素20 mylist.insert (it,2,20); // 1 10 20 20 2 3 4 5 --it; // 现在it指向数字20 ^ vector<int> myvector (2,30); //创建vector容器,并初始化为含有2个值为30的元素 //将vector容器的值插入list中 mylist.insert (it,myvector.begin(),myvector.end()); // 1 10 20 30 30 20 2 3 4 5 //it仍然指向数字20 // ^ cout << "mylist contains:"; for (it = mylist.begin(); it != mylist.end(); ++it) cout << ‘ ‘ << *it; cout << ‘\n‘; return 0; } 输出结果: mylist contains: 1 10 20 30 30 20 2 3 4 5
4.erases删除元素
// erasing from list #include <iostream> #include <list> using namespace std; int main () { list<int> mylist; list<int>::iterator it1,it2; // set some values: for (int i = 1; i < 10; ++i) mylist.push_back(i*10); // 10 20 30 40 50 60 70 80 90 it1 = it2 = mylist.begin(); // ^^ advance (it2,6); // ^ ^ ++it1; // ^ ^ it1 = mylist.erase (it1); // 10 30 40 50 60 70 80 90 // ^ ^
it2 = mylist.erase (it2); // 10 30 40 50 60 80 90 // ^ ^ ++it1; // ^ ^ --it2; // ^ ^ //没有变量接收其返回值 mylist.erase (it1,it2); // 10 30 60 80 90 // ^ cout << "*it1 : " << *it1 << endl; cout << "mylist contains:"; for (it1 = mylist.begin(); it1 != mylist.end(); ++it1) cout << ‘ ‘ << *it1; cout << ‘\n‘; return 0; } 输出结果: it1 : 40 mylist contains: 10 30 60 80 90
5.clear() 清空
5.对列表的一些操作
1.unique 删除重复值
// list::unique #include <iostream> #include <cmath> #include <list> using namespace std; // a binary predicate implemented as a function: bool same_integral_part (double first, double second) { return ( int(first)==int(second) ); } // a binary predicate implemented as a class: struct is_near { bool operator() (double first, double second) { return (fabs(first-second)<5.0); } }; int main () { double mydoubles[] = { 12.15, 2.72, 73.0, 12.77, 3.14, 12.77, 73.35, 72.25, 15.3, 72.25 }; list<double> mylist (mydoubles,mydoubles+10); cout << "mylist contains:"; for (list<double>::iterator it = mylist.begin(); it != mylist.end(); ++it) cout << ‘ ‘ << *it; cout << ‘\n‘; mylist.unique(); cout << "mylist contains:"; for (list<double>::iterator it = mylist.begin(); it != mylist.end(); ++it) cout << ‘ ‘ << *it; cout << ‘\n‘; mylist.sort(); // 2.72, 3.14, 12.15, 12.77, 12.77, // 15.3, 72.25, 72.25, 73.0, 73.35 mylist.unique(); // 2.72, 3.14, 12.15, 12.77 // 15.3, 72.25, 73.0, 73.35 cout << "mylist contains:"; for (list<double>::iterator it = mylist.begin(); it != mylist.end(); ++it) cout << ‘ ‘ << *it; cout << ‘\n‘; mylist.unique (same_integral_part); // 2.72, 3.14, 12.15 // 15.3, 72.25, 73.0 cout << "mylist contains:"; for (list<double>::iterator it = mylist.begin(); it != mylist.end(); ++it) cout << ‘ ‘ << *it; cout << ‘\n‘; mylist.unique (is_near()); // 2.72, 12.15, 72.25 cout << "mylist contains:"; for (list<double>::iterator it = mylist.begin(); it != mylist.end(); ++it) cout << ‘ ‘ << *it; cout << ‘\n‘; return 0; } 输出结果: mylist contains: 12.15 2.72 73 12.77 3.14 12.77 73.35 72.25 15.3 72.25 mylist contains: 12.15 2.72 73 12.77 3.14 12.77 73.35 72.25 15.3 72.25 mylist contains: 2.72 3.14 12.15 12.77 15.3 72.25 73 73.35 mylist contains: 2.72 3.14 12.15 15.3 72.25 73 mylist contains: 2.72 12.15 72.25
2.sort 排序
void sort();//默认升序
void sort(bool cmp);//按照自定的cmp函数的true值排列
对于自定的类型还可以在共有函数中重载“<”运算符进行定义
// list::sort #include <iostream> #include <list> #include <string> #include <cctype> using namespace std; // comparison, not case sensitive. bool compare_nocase (const string& first, const string& second) { unsigned int i = 0; while ((i < first.length()) && (i < second.length()) ) { //将大写字母转为小写字母 if (tolower(first[i]) < tolower(second[i])) return true; else if (tolower(first[i]) > tolower(second[i])) return false; ++i; } return ( first.length() < second.length() ); } int main () { list<string> mylist; list<string>::iterator it; mylist.push_back ("one"); mylist.push_back ("two"); mylist.push_back ("Three"); mylist.sort(); cout << "mylist contains:"; for (it = mylist.begin(); it != mylist.end(); ++it) cout << ‘ ‘ << *it; cout << ‘\n‘; mylist.sort(compare_nocase); cout << "mylist contains:"; for (it = mylist.begin(); it != mylist.end(); ++it) cout << ‘ ‘ << *it; cout << ‘\n‘; return 0; } 输出结果: mylist contains: Three one two mylist contains: one Three two
3.merge 合并两个有序列表
注意:一定是有序才可以,不然在合并前要先sort()
// list::merge #include <iostream> #include <list> using namespace std; // compare only integral part: bool mycomparison (double first, double second) { return ( (first)<(second) ); } int main () { list<double> first, second; first.push_back (3.1); first.push_back (2.2); first.push_back (2.9); second.push_back (3.7); second.push_back (7.1); second.push_back (1.4); first.sort(); second.sort(); first.merge(second); cout << "first contains:"; for (list<double>::iterator it = first.begin(); it != first.end(); ++it) cout << ‘ ‘ << *it; cout << ‘\n‘; // (second 现在为空) second.push_back (2.1); second.push_back(2.5); first.merge(second,mycomparison); cout << "first contains:"; for (list<double>::iterator it = first.begin(); it != first.end(); ++it) cout << ‘ ‘ << *it; cout << ‘\n‘; return 0; } 输出结果: first contains: 1.4 2.2 2.9 3.1 3.7 7.1 first contains: 1.4 2.1 2.2 2.5 2.9 3.1 3.7 7.1
Iterators:
Capacity:
Element access:
Modifiers:
Operations:
Observers:
标签:删除元素 lis first 初始化 定义 near temp amp 有序列表
原文地址:https://www.cnblogs.com/zhanghengyu/p/10888920.html