STL----list
来源:互联网 发布:windows longhorn 编辑:程序博客网 时间:2024/06/16 14:48
C++ list用法
创建一个list实例并赋值:
1 // 创建实例以及赋值 2 #include <iostream> 3 #include <list> 4 using namespace std; 5 int main () { 6 //第一种,通过构造函数 7 int myints[] = {75,23,65,42,13}; 8 list<int> mylist1(myints, myints+5); 9 list<int> mylist2(2,100); // 2个值为100的元素10 //第二种,用push_back,或push_front11 for (int i = 1; i <= 5; ++i) mylist1.push_back(i);12 mylist2.push_front (200);13 mylist2.push_front (300);14 //第三种,用assign15 list<int> first;16 list<int> second;17 first.assign(7,100); // 给first添加7个值为100的元素18 second.assign(first.begin(), first.end()); // 复制first给second19 int myints[] = {16, 8, 4};20 first.assign (myints, myints + 3); // 将数组myints的内容添加给first21 22 //第四种,见insert函数23 return 0;24 }
成员函数:
Iterator: (可用于遍历list)
iterator begin(); //返回指向第一个元素的迭代器
iterator end(); //返回指向最后一个元素的迭代器
reverse_iterator rbegin(); //返回指向第一个元素的逆向迭代器
reverse_rend(); //返回指向最后一个元素的逆向迭代器
1 //list的遍历 2 #include <iostream> 3 #include <list> 4 using namespace std; 5 int main () { 6 int myints[] = {75,23,65,42,13}; 7 list<int> mylist (myints,myints+5); 8 cout << "mylist contains:"; 9 //这是正序输出:10 for (list<int>::iterator it = mylist.begin(); it != mylist.end(); ++it)11 cout << ' ' << *it;12 cout << '\n';13 14 list.clear();15 //逆序输出:16 for (int i = 1; i <= 5; ++i) mylist.push_back(i);17 cout << "mylist backwards:";18 for (list<int>::reverse_iterator rit = mylist.rbegin(); rit != mylist.rend(); ++rit)19 cout << ' ' << *rit;20 cout << '\n';21 return 0;22 }输出结果为:mylist contains: 75 23 65 42 13mylist backwards: 5 4 3 2 1
Capacity: (用于获取list容器大小信息)
bool empty() const; //list为空时返回true
size_type size() const; //返回list容器里元素的个数
size_type max_size() const; //返回list容器最大能容纳的元素的个数,主要用于调用list的resize()函数时,检查所请求的size大小是否被允许
Element access:(用于获取首尾元素)
reference front(); //返回第一个元素的引用
const_reference front() const;
reference back(); //返回最后一个元素的引用
const_reference front() const;
Modifiers:
asign //给容器添加新内容:
template<class InputIterator>
void assign(InputIterator first, InputIterator last); //first,last是一个序列中起始和结束的迭代器的值,[first, last)包含了序列中所有元素
void assign(size_type n, const value_type& val); //给list赋值n个值为val的元素
1 // list::assign 2 #include <iostream> 3 #include <list> 4 using namespace std; 5 int main () { 6 list<int> first; 7 list<int> second; 8 first.assign(7,100); // 给first添加7个值为100的元素 9 second.assign(first.begin(), first.end()); // 复制first给second10 11 int myints[] = {16, 8, 4};12 first.assign (myints, myints + 3); // 将数组myints的内容添加给first13 14 cout << "Size of first: " << int (first.size()) << '\n';15 cout << "Size of second: " << int (second.size()) << '\n';16 return 0;17 }输出结果为:Size of first: 3Size of second: 7
push_front, pop_front, push_back, pop_back
void push_front(const value_type& val); //在list头添加元素
void pop_front(); //删除list头的元素
void push_back(const value_type& val); //在list尾添加元素
void pop_back(); //删除list尾的元素
1 #include <iostream> 2 #include <list> 3 using namespace std; 4 int main () { 5 list<int> mylist (2,100); // 2个值为100的元素 6 // list::push_front 7 mylist.push_front (200); 8 mylist.push_front (300); 9 10 cout << "mylist contains:";11 for (list<int>::iterator it = mylist.begin(); it != mylist.end(); ++it)12 cout << ' ' << *it;13 cout << '\n';14 15 // list::pop_front16 cout << "Popping out the elements in mylist:";17 while (!mylist.empty()) {18 cout << ' ' << mylist.front();19 mylist.pop_front();20 }21 cout << "\nFinal size of mylist is " << mylist.size() << '\n';22 23 // list::push_back24 int myint;25 cout << "Please enter some integers (enter 0 to end):\n";26 do {27 cin >> myint;28 mylist.push_back (myint);29 } while (myint);30 cout << "mylist contains:";31 for (list<int>::iterator it = mylist.begin(); it != mylist.end(); ++it)32 cout << ' ' << *it;33 cout << '\n';34 35 // list::pop_back36 while (!mylist.empty()) {37 cout << ' ' << mylist.back();38 mylist.pop_back();39 }40 cout << "\nFinal size of mylist is " << mylist.size() << '\n';41 42 return 0;43 }输出结果:mylist contai: 300 200 100 100Popping out the elements in mylist: 300 200 100 100Final size of mylist is 0Please enter some integers (enter 0 to end):56 23 8 5 6 0mylist contains: 56 23 8 5 6 0 0 6 5 8 23 56Final size of mylist is 0
insert //插入元素:
iterator insert (iterator position, const value_type& val); //position是要插入的这个list的迭代器,val是要插入的值
void insert (iterator position, size_type n, const value_type& val); //从该list容器中的position位置处开始,插入n个值为val的元素
template <class InputIterator>
void insert (iterator position, InputIterator first, InputIterator last); //first,last是我们选择的把值插入到这个list中的值所在的容器的迭代器
1 // inserting into a list 2 #include <iostream> 3 #include <list> 4 #include <vector> 5 using namespace std; 6 int main () { 7 list<int> mylist; 8 list<int>::iterator it; 9 // 初始化10 for (int i = 1; i <= 5; ++i) mylist.push_back(i); // 1 2 3 4 511 it = mylist.begin();12 ++it; // 迭代器it现在指向数字2 ^13 //在i0t指向的位置出插入元素1014 mylist.insert (it,10); // 1 10 2 3 4 515 16 // "it" 仍然指向数字2 ^17 //在it指向的位置出插入两个元素2018 mylist.insert (it,2,20); // 1 10 20 20 2 3 4 519 20 --it; // 现在it指向数字20 ^21 22 vector<int> myvector (2,30); //创建vector容器,并初始化为含有2个值为30的元素23 //将vector容器的值插入list中24 mylist.insert (it,myvector.begin(),myvector.end());25 // 1 10 20 30 30 20 2 3 4 526 //it仍然指向数字20 // ^27 cout << "mylist contains:";28 for (it = mylist.begin(); it != mylist.end(); ++it)29 cout << ' ' << *it;30 cout << '\n';31 32 return 0;33 }输出结果:mylist contains: 1 10 20 30 30 20 2 3 4 5
erase //删除元素:
iterator erase (iterator position); //删除迭代器position指向的值,也可以不用变量接收其返回值
iterator erase (iterator first, iterator last); //删除[first, last)中的值,也可以不用变量接收其返回值
1 // erasing from list 2 #include <iostream> 3 #include <list> 4 using namespace std; 5 int main () { 6 list<int> mylist; 7 list<int>::iterator it1,it2; 8 9 // set some values:10 for (int i = 1; i < 10; ++i) mylist.push_back(i*10);11 12 // 10 20 30 40 50 60 70 80 9013 it1 = it2 = mylist.begin(); // ^^14 advance (it2,6); // ^ ^15 ++it1; // ^ ^16 17 it1 = mylist.erase (it1); // 10 30 40 50 60 70 80 9018 // ^ ^19 20 it2 = mylist.erase (it2); // 10 30 40 50 60 80 9021 // ^ ^22 23 ++it1; // ^ ^24 --it2; // ^ ^25 //没有变量接收其返回值26 mylist.erase (it1,it2); // 10 30 60 80 9027 // ^28 cout << "*it1 : " << *it1 << endl;29 cout << "mylist contains:";30 for (it1 = mylist.begin(); it1 != mylist.end(); ++it1)31 cout << ' ' << *it1;32 cout << '\n';33 34 return 0;35 }输出结果:it1 : 40mylist contains: 10 30 60 80 90
swap //交换两个list的内容
void swap(list& x); //要交换的两个列表的存储的元素的类型必须是一样的,列表大小可以不同
1 // swap lists 2 #include <iostream> 3 #include <list> 4 using namespace std; 5 int main () { 6 list<int> first (3,100); // 三个值为100的元素 7 list<int> second (5,200); // 五个值为200的元素 8 9 first.swap(second);10 11 cout << "first contains:";12 for (list<int>::iterator it = first.begin(); it != first.end(); it++)13 cout << ' ' << *it;14 cout << '\n';15 16 cout << "second contains:";17 for (list<int>::iterator it = second.begin(); it != second.end(); it++)18 cout << ' ' << *it;19 cout << '\n';20 21 return 0;22 }输出结果:first contains: 200 200 200 200 200second contains: 100 100 100
resize //调整list大小
void resize (size_type n, value_type val = value_type()); //将list大小调整为能容纳n个元素,若n大于当前list大小,则会从list末尾一直插入val值,直到list大小满足n;
1 // resizing list 2 #include <iostream> 3 #include <list> 4 using namespace std; 5 int main () { 6 list<int> mylist; 7 8 // 初始化 9 for (int i = 1; i < 10; ++i) mylist.push_back(i);10 11 mylist.resize(5);12 mylist.resize(8,100);13 mylist.resize(12);14 15 cout << "mylist contains:";16 for (list<int>::iterator it = mylist.begin(); it != mylist.end(); ++it)17 cout << ' ' << *it;18 cout << '\n';19 20 return 0;21 }输出结果:mylist contains: 1 2 3 4 5 100 100 100 0 0 0 0
clear //清空list
void clear(); //删除list的所有元素
1 // clearing lists 2 #include <iostream> 3 #include <list> 4 using namespace std; 5 int main () { 6 list<int> mylist; 7 list<int>::iterator it; 8 9 mylist.push_back (100);10 mylist.push_back (200);11 mylist.push_back (300);12 13 cout << "mylist contains:";14 for (it = mylist.begin(); it != mylist.end(); ++it)15 cout << ' ' << *it;16 cout << '\n';17 18 mylist.clear();19 mylist.push_back (1101);20 mylist.push_back (2202);21 22 cout << "mylist contains:";23 for (it = mylist.begin(); it != mylist.end(); ++it)24 cout << ' ' << *it;25 cout << '\n';26 27 return 0;28 }输出结果:mylist contains: 100 200 300mylist contains: 1101 2202
Operations:
splice //将一个list中的值移到另一个list中
void splice (iterator position, list& x); //将列表x中的所有元素移到当前list中,从当前列表的position指向的位置开始,此时列表x为空
void splice (iterator position, list& x, iterator i); //将列表x中迭代器 i 指向的元素移到当前list的position指向的位置处,由于i指向的元素从列表x中被移除,所以迭代器 i 此时是invalid的;position是当前列表的迭代器,i是列表x的迭代器
void splice (iterator position, list& x, iterator first, iterator last); //将列表x中[first, last)的元素移到当前list中,从position指向的位置开始;first, last是列表x的迭代器
1 // splicing lists 2 #include <iostream> 3 #include <list> 4 using namespace std; 5 int main () { 6 list<int> mylist1, mylist2; 7 list<int>::iterator it; 8 9 // 初始化10 for (int i = 1; i <= 4; ++i)11 mylist1.push_back(i); // mylist1: 1 2 3 412 13 for (int i = 1; i <= 3; ++i)14 mylist2.push_back(i*10); // mylist2: 10 20 3015 16 it = mylist1.begin();17 ++it; // 指向数字218 19 mylist1.splice (it, mylist2); // mylist1: 1 10 20 30 2 3 420 // mylist2 (empty)21 // "it" 仍然指向数字222 23 mylist2.splice (mylist2.begin(),mylist1, it);24 // mylist1: 1 10 20 30 3 425 // mylist2: 226 // "it" 此时已经无效了27 it = mylist1.begin();28 advance(it,3); // "it" 指向数字3029 30 mylist1.splice ( mylist1.begin(), mylist1, it, mylist1.end());31 // mylist1: 30 3 4 1 10 2032 33 cout << "mylist1 contains:";34 for (it = mylist1.begin(); it != mylist1.end(); ++it)35 cout << ' ' << *it;36 cout << '\n';37 38 cout << "mylist2 contains:";39 for (it = mylist2.begin(); it != mylist2.end(); ++it)40 cout << ' ' << *it;41 cout << '\n';42 43 return 0;44 }输出结果:mylist1 contains: 30 3 4 1 10 20mylist2 contains: 2
remove //删除list中特定的值
void remove (const value_type& val); //从list中删除所有值为val的元素
1 // remove from list 2 #include <iostream> 3 #include <list> 4 using namespace std; 5 int main () { 6 int myints[]= {17, 89, 7, 89, 14}; 7 list<int> mylist (myints,myints+5); 8 9 mylist.remove(89);10 11 cout << "mylist contains:";12 for (list<int>::iterator it = mylist.begin(); it != mylist.end(); ++it)13 cout << ' ' << *it;14 cout << '\n';15 16 return 0;17 }输出结果:mylist contains: 17 7 14
remove_if //按条件删除
template <class Predicate>
void remove_if (Predicate pred); //pred可以是一个函数,也可以是一个class,但它需要有一个参数,且参数类型跟list中存储元素类型相同,满足条件就返回true
1 // list::remove_if 2 #include <iostream> 3 #include <list> 4 using namespace std; 5 // a predicate implemented as a function: 6 bool single_digit (const int& value) { return (value < 10); } 7 8 // a predicate implemented as a class: 9 struct is_odd {10 //重载操作符 ()11 bool operator() (const int& value) { return (value % 2) == 1; }12 };13 14 int main () {15 int myints[] = {15, 36, 7, 17, 20, 39, 4, 1};16 list<int> mylist (myints, myints + 8); // 15 36 7 17 20 39 4 117 18 mylist.remove_if (single_digit); // 15 36 17 20 3919 20 mylist.remove_if (is_odd()); // 36 2021 22 cout << "mylist contains:";23 for (std::list<int>::iterator it=mylist.begin(); it!=mylist.end(); ++it)24 cout << ' ' << *it;25 cout << '\n';26 27 return 0;28 }输出结果:mylist contains: 36 20
unique //删除重复值
void unique(); //只能删除相邻的重复元素,然后保留第一个值,因此这个函数只对排好序的list有用
template <class BinaryPredicate>
void unique (BinaryPredicate binary_pred); //binary_pred可以是函数,也可以是class,但它需要有两个参数,且类型跟list中存储的值类型相同,满足某个条件就返回true
1 // list::unique 2 #include <iostream> 3 #include <cmath> 4 #include <list> 5 using namespace std; 6 // a binary predicate implemented as a function: 7 bool same_integral_part (double first, double second) { return ( int(first)==int(second) ); } 8 9 // a binary predicate implemented as a class:10 struct is_near {11 bool operator() (double first, double second) { return (fabs(first-second)<5.0); }12 };13 14 int main () {15 double mydoubles[] = { 12.15, 2.72, 73.0, 12.77, 3.14,16 12.77, 73.35, 72.25, 15.3, 72.25 };17 list<double> mylist (mydoubles,mydoubles+10);18 cout << "mylist contains:";19 for (list<double>::iterator it = mylist.begin(); it != mylist.end(); ++it)20 cout << ' ' << *it;21 cout << '\n';22 23 mylist.unique();24 cout << "mylist contains:";25 for (list<double>::iterator it = mylist.begin(); it != mylist.end(); ++it)26 cout << ' ' << *it;27 cout << '\n';28 29 mylist.sort(); // 2.72, 3.14, 12.15, 12.77, 12.77,30 // 15.3, 72.25, 72.25, 73.0, 73.3531 32 mylist.unique(); // 2.72, 3.14, 12.15, 12.7733 // 15.3, 72.25, 73.0, 73.3534 cout << "mylist contains:";35 for (list<double>::iterator it = mylist.begin(); it != mylist.end(); ++it)36 cout << ' ' << *it;37 cout << '\n';38 39 mylist.unique (same_integral_part); // 2.72, 3.14, 12.1540 // 15.3, 72.25, 73.041 cout << "mylist contains:";42 for (list<double>::iterator it = mylist.begin(); it != mylist.end(); ++it)43 cout << ' ' << *it;44 cout << '\n';45 46 mylist.unique (is_near()); // 2.72, 12.15, 72.2547 48 cout << "mylist contains:";49 for (list<double>::iterator it = mylist.begin(); it != mylist.end(); ++it)50 cout << ' ' << *it;51 cout << '\n';52 53 return 0;54 }输出结果:mylist contains: 12.15 2.72 73 12.77 3.14 12.77 73.35 72.25 15.3 72.25mylist contains: 12.15 2.72 73 12.77 3.14 12.77 73.35 72.25 15.3 72.25mylist contains: 2.72 3.14 12.15 12.77 15.3 72.25 73 73.35mylist contains: 2.72 3.14 12.15 15.3 72.25 73mylist contains: 2.72 12.15 72.25
merge //合并有序的list
void merge(list &x); //会将列表x中的元素按默认的顺序移入当前列表当中,此时列表x为空,当前列表仍为有序列表
template<class Compare>
void merge (list& x, Compare comp); //comp可以为一个函数,要求有两个参数且参数类型跟list中存储的元素类型相同,当满足条件时返回true,merge就按照这个条件将两个列表合并
1 // list::merge 2 #include <iostream> 3 #include <list> 4 using namespace std; 5 // compare only integral part: 6 bool mycomparison (double first, double second) { return ( (first)<(second) ); } 7 8 int main () { 9 list<double> first, second;10 11 first.push_back (3.1);12 first.push_back (2.2);13 first.push_back (2.9);14 15 second.push_back (3.7);16 second.push_back (7.1);17 second.push_back (1.4);18 19 first.sort();20 second.sort();21 22 first.merge(second);23 cout << "first contains:";24 for (list<double>::iterator it = first.begin(); it != first.end(); ++it)25 cout << ' ' << *it;26 cout << '\n';27 // (second 现在为空)28 29 second.push_back (2.1);30 second.push_back(2.5);31 32 first.merge(second,mycomparison);33 cout << "first contains:";34 for (list<double>::iterator it = first.begin(); it != first.end(); ++it)35 cout << ' ' << *it;36 cout << '\n';37 38 return 0;39 }输出结果:first contains: 1.4 2.2 2.9 3.1 3.7 7.1first contains: 1.4 2.1 2.2 2.5 2.9 3.1 3.7 7.1
sort //排序
void sort(); //默认升序排列
template <class Compare>
void sort (Compare comp); //comp可以是一个函数,要求有两个参数,类型跟list中元素类型相同,满足条件时返回true,sort()函数就按照comp中制定的规则对元素进行排序
1 // list::sort 2 #include <iostream> 3 #include <list> 4 #include <string> 5 #include <cctype> 6 using namespace std; 7 // comparison, not case sensitive. 8 bool compare_nocase (const string& first, const string& second) { 9 unsigned int i = 0;10 while ((i < first.length()) && (i < second.length()) ) {11 //将大写字母转为小写字母12 if (tolower(first[i]) < tolower(second[i])) return true;13 else if (tolower(first[i]) > tolower(second[i])) return false;14 ++i;15 }16 return ( first.length() < second.length() );17 }18 19 int main () {20 list<string> mylist;21 list<string>::iterator it;22 mylist.push_back ("one");23 mylist.push_back ("two");24 mylist.push_back ("Three");25 26 mylist.sort();27 28 cout << "mylist contains:";29 for (it = mylist.begin(); it != mylist.end(); ++it)30 cout << ' ' << *it;31 cout << '\n';32 33 mylist.sort(compare_nocase);34 35 cout << "mylist contains:";36 for (it = mylist.begin(); it != mylist.end(); ++it)37 cout << ' ' << *it;38 cout << '\n';39 40 return 0;41 }输出结果:mylist contains: Three one twomylist contains: one Three two
reverse //逆序:
void reverse(); //将list中元素的顺序逆转过来
1 // reversing list 2 #include <iostream> 3 #include <list> 4 using namespace std; 5 int main () { 6 list<int> mylist; 7 8 for (int i = 1; i < 10; ++i) mylist.push_back(i); 9 10 mylist.reverse();11 12 cout << "mylist contains:";13 for (list<int>::iterator it = mylist.begin(); it != mylist.end(); ++it)14 cout << ' ' << *it;15 cout << '\n';16 17 return 0;18 }输出结果:mylist contains: 9 8 7 6 5 4 3 2 1
Observers:
get_allocator //返回一个跟该list有关的分配器对象
allocator_type get_allocator() const; //可以用来给数组动态分配空间
1 // list::get_allocator 2 #include <iostream> 3 #include <list> 4 using namespace std; 5 int main () { 6 list<int> mylist; 7 int * p; 8 9 // allocate an array of 5 elements using mylist's allocator:10 p = mylist.get_allocator().allocate(5);11 12 // assign some values to array13 for (int i = 0; i < 5; ++i) p[i] = i;14 15 cout << "The allocated array contains:";16 for (int i = 0; i < 5; ++i) cout << ' ' << p[i];17 cout << '\n';18 19 mylist.get_allocator().deallocate(p,5);20 21 return 0;22 }输出结果:The allocated array contains: 9 8 7 6 5 4 3 2 1
- STL--list
- STL--list
- STL list
- STL list
- STL----list
- STL list
- stl-list
- stl list
- STL--list
- STL list
- stl list
- STL---List
- STL list
- STL list
- STL list
- STL list
- STL list
- STL List
- javaweb如何返回一个无键JSON数组给前端,以JSF为例
- android ndk开发SIGSEGV错误
- Linux系统中的运行级别
- 51nod 1629 B君的圆锥 (数学)
- XZ_Swift之Swift中的错误/异常处理、反序列化
- STL----list
- IMPDP/EXPDP + network_link的使用
- const_cast, dynamic_cast, static_cast,reinterpret_cast
- Python3爬取简书首页文章的标题和文章链接
- Gym
- linux操作日志
- 分享深度学习的视频网址
- 使用python向excel中写入数据(中英文混合)
- android移动View