首先对STL不熟悉的同学,可以先看看这篇文章里有些东西:
知识点综述:
List:序列式容器,双向链表,在内存中不连续存放。
优点: 插入,删除元素效率高。
STL的基本知识点:
1.0 容器:容纳各种数据类型的通用数据结构,是类模板。
2.0 迭代器:可以依次存取容器的元素,类似指针。
3.0 算法用来操作容器中元素的函数模板。
list数据结构: list.PNG
list相关函数:
list相关函数.PNG相关代码:
#include<iostream>
#include<list>
#include<string>
#include<cstdlib>
#include <algorithm>
#include<ctime>
#include<fstream>
using namespace std;
// void displayfor(list<int> li);
void displayiterator(list<int> li);
void displayforeach(list<int> li);
void randList(list<int> &li);
void writeFile(list<int> li);
int main()
{
//创建vector对象。
list<int> li; //容器为空。
//bool empty() 判断容器是否为空(返回true时为空)
cout << "li 是否为空:" <<li.empty() << endl;
//void push_back()在容器对象末尾添加新元素
li.push_back(16); //添加元素
li.push_back(18);
li.push_back(19);
//int size() 返回容器的大小(元素的数目)
int size = li.size();
cout << "容器的大小:" << size << endl;
displayforeach(li);
cout << endl << "---------------------" << endl;
//void pop_back() 删除容器对象末尾的元素
cout << "删除容器对象末尾的元素." << endl;
li.pop_back();
displayiterator(li); //迭代器遍历
cout << endl << "---------------------" << endl;
/*void insert() 在容器对象末尾插入一个或多个元素
iterator insert(iterator loc, const TYPE &val);
void insert(iterator loc, size_type num, const TYPE &val);
void insert(iterator loc, input_iterator start, input_iterator end);
insert() 函数有以下三种用法:
在指定位置loc前插入值为val的元素, 返回指向这个元素的迭代器,
在指定位置loc前插入num个值为val的元素
在指定位置loc前插入区间[start, end)的所有元素 .
*/
list<int>::iterator iter1 = li.end();
list<int>::iterator iter2 = li.begin();
li.insert(iter1, 22);
li.insert(iter2, 33);
cout << "头部和尾部分部追加一个元素" << endl;
displayforeach(li); //foreach遍历
cout << endl << "---------------------" << endl;
// int max_size()
cout << "容器的最大的容量:" << li.max_size() << endl;
list<int> li1(6, 8);
cout << "li的元素:";
displayforeach(li1);
// void swap() 交换两个容器的对象
cout << endl << "---------------------" << endl;
li.swap(li1);
cout << "交换li和li1 " << "li的元素:";
displayiterator(li);
cout << endl;
/*
//int reserve(int n) 设置容器最小的元素容纳数量
li.reserve(9);
cout << endl << "容器的最大的容量:" << vec.capacity() << endl;
cout << "容器的大小:" << vec.size() << endl;
*/
//void clear() 删除容器对象的所有元素。
li.clear();
cout << " 删除容器vec对象的所有元素" << " vec的元素:";
displayforeach(li);
cout << endl << "---------------------" << endl;
//void clear() 删除容器对象的所有元素。
li.clear();
cout << " 删除容器vec对象的所有元素" << " vec的元素:";
displayforeach(li);
cout << endl << "---------------------" << endl;
randList(li); //随机生产数字放入 list中。
cout << endl;
list<int> li2;
/*list特有的函数
void assign( input_iterator start, input_iterator end );
void assign( size_type num, const TYPE &val );
assign()函数以迭代器start和end指示的范围为list赋值
或者为list赋值num个以val为值的元素。s
*/
li2.assign(li.begin(), li.end());
cout << "li的元素:";
displayforeach(li);
cout << endl;
cout << "li2中的元素:";
displayiterator(li2);
//back() 返回最后一个元素
//front() 返回第一个元素
cout << endl;
cout << "li最后一个元素:" << li.back() << endl;
cout<< "li第一个元素:" << li.front() << endl;
cout << "---------------------" << endl;
/*
iterator erase( iterator pos );
iterator erase( iterator start, iterator end );
*/
cout << "删除第2个元素:" << endl;
list<int>::iterator lit = li.begin();
lit++;
li.erase(lit);
cout << "li的元素:";
displayforeach(li);
cout << endl;
// void reverse();
// reverse()函数把list所有元素倒转。
cout << "li的元素倒置:" << endl;;
li.reverse();
cout << "li的元素:";
displayforeach(li);
cout << endl;
/* void sort();
void sort(Comp compfunction);
sort()函数为链表排序,默认是升序。如果指定compfunction的话,
就采用指定函数来判定两个元素的大小。
*/
li.sort();
cout << "li升序排列:";
displayforeach(li);
cout << endl;
/*
void splice( iterator pos, list &lst );
void splice( iterator pos, list &lst, iterator del );
void splice( iterator pos, list &lst, iterator start, iterator end );
splice()函数把lst连接到pos的位置。如果指定其他参数,
则插入lst中del所指元素到现链表的pos上,或者用start和end指定范围。
*/
li2.clear();
randList(li2);
cout << endl;
cout << "li2的元素:";
displayforeach(li2);
li.splice(li.end(), li2);
cout << endl;
cout<<"把li2链接到li末尾:"<<endl << "li的元素:";
displayforeach(li);
cout << endl;
//unique() 删除list中重复的元素
li.unique();
cout << " 删除list中重复的元素 " << endl;
cout << "li的元素:";
displayforeach(li);
cout << endl;
//把 li的数据保存到文件中。
writeFile(li);
system("pause");
return 0;
}
/*
rand
语法:int rand( void );
功能: 函数返回一个在零到RAND_MAX 之间的伪随机整数。
例如: srand( time(NULL) );
for( i = 0; i < 10; i++ )
printf( "Random number #%d: %d\n", i, rand() );
srand
语法: void srand( unsigned seed );
功能: 设置rand()随机序列种子。对于给定的种子seed, rand()会反复产生特定的随机序列。
srand( time(NULL) );
for( i = 0; i < 10; i++ )
printf( "Random number #%d: %d\n", i, rand() );
*/
void randList(list<int> &li) {
srand((int) time(NULL));
for (int i = 0; i <8; i++)
{
li.push_back(rand()%100);
}
}
//迭代器遍历
void displayiterator(list<int> li) {
/*
iterator begin() 返回指定容器对象的首元素的迭代器。
iterator end() 返回指定容器对象的末元素后面位置的迭代器
*/
list<int>::iterator ite;
for (ite = li.begin(); ite!=li.end(); ite++)
cout << *ite << " ";
}
//foreach遍历
void displayforeach(list<int>li) {
for (int i : li) {
cout << i << " ";
}
}
void writeFile(list<int> li) {
cout << "数据写入文件" << endl;
ofstream ofs("D:\\works_c++\\list.txt");
list<int>::iterator it;
for (it = li.begin(); it != li.end(); it++)
ofs << *it << " ";
}
结果:
结果.PNG
文件.PNG
对C++ I/O流不熟悉的同学,可以看看这篇文章:
参考文献:
今天早上跑步了,坚持继续加油.
c++ 的文章可以写许多,c11还有好多东西,其实我想写java了。