C++学习 2018-12-17

本文详细介绍了C++中的STL标准模板库,重点讲解了vector容器和algorithm中的函数,如vector的构造、遍历、size与capacity的区别、begin与front、back的用法以及clear方法。此外,还探讨了algorithm中的元素随机排列和排序等算法。在list部分,阐述了lst的remove、unique、splice等操作,并讨论了何时选择使用list和vector。

1.STL:标准模板库

1.STL有六大组件

1.容器(序列容器和关联容器)
2.迭代器
3.算法(algorithm)
4.空间配置器
5.配接器
6.仿函数

2.vector容器

1.vector(int) vec

vec是一个容器对象,相当于int arr[];
vector(int) vec(10) 相当于 int arr[10];

2.遍历vec中元素的方法

1.迭代器

int main()
{
	vector(int) vec(10);
	vec.push_back(1);
	vec.push_back(2);
	vec.push_back(3);
	vec.push_back(4);
	vec.push_back(5);

	vector(int)::iterator vec_ite = vec.begin();
	while(vec_ite != vec.end())
	{
		cout << *vec_ite << endl;
		vec_ite++;
	}

	system("pause");
	return 0;
}

2.下标

int main()
{
	vector(int) vec(10);
	vec.push_back(1);
	vec.push_back(2);
	vec.push_back(3);
	vec.push_back(4);
	vec.push_back(5);

	for(int i=0; i<10; i++)
	{
		cout << vec[i] << endl;
	}

	system("pause");
	return 0;
}

3.algorithm中的for_each

void ShowVec(int a)
{
	cout << a << " ";
}

int main()
{
	vector(int) vec(10);
	vec.push_back(1);
	vec.push_back(2);
	vec.push_back(3);
	vec.push_back(4);
	vec.push_back(5);

	::for_each(vec.begin(), vec.end(), &ShowVec);

	system("pause");
	return 0;
}
3.vec.size()与vec.capacity()

1.vec.size()是其元素所占用空间大小,vec.capacity()是其所拥有的空间大小;
2.当分配的内存不够时,重新分配的大小为原来空间的1.5倍。

4.vec.begin()与vec.front()、vec.back()

vec.begin()返回的是指针 p,vec.front()和vec.back()返回的是值 *p。

5.vec.clear()

清空的是vec中的内容,所占内存还存在,当其生命周期结束时彻底删除。

3.algorithm中的函数

1.将vec(10)中的元素随机排列

使用algorithm中的random_shuffle(vec.begin(), vec.end()),该函数传入的参数是想要随机的区域(从哪到哪),要想真正随机,需要在使用该函数之前添加随机数种子,srand((unsigned int)time(0))。

2.将vec(10)中的随即元素排好序

传入的参数仍是需要排序的区域,可以传入排序的规则(函数指针)。

3.获得倒序

::reverse(vec.begin(), vec.end());

4.获得其中元素的计数

::count(vec.begin(), vec.end(), 1):获得vec中1的个数。

=========================================================================================

看视频的补充

对于list

1.lst.remove(value):删除lst中所有的value值。
2.lst.unique():删除连续相同的,只留下一个。
3.lst.splice(itePos, lst2):在lst的itePos位置插入整个lst2链表,插入之后第二个链表为空。
void ShowLst(int a)
{
	cout << a << " ";
}

int main()
{
	list<int> lst;
	lst.push_back(1);
	lst.push_back(2);
	lst.push_back(3);
	lst.push_back(4);
	lst.push_back(5);

	list<int> lst2;
	lst2.push_back(11);
	lst2.push_back(12);
	lst2.push_back(13);
	lst2.push_back(14);
	lst2.push_back(15);

	list<int>::iterator itePos = find(lst.begin(), lst.end(), 5);
	lst.splice(itePos, lst2);
	::for_each(lst.begin(), lst.end(), &ShowLst);
	cout << "=========================================" << endl;
	::for_each(lst.begin(), lst.end(), &ShowLst);
	cout << "=========================================" << endl;

	system("pause");
	return 0;
}
4.lst.splice(itePos, lst2, firstPos):在lst的itePos位置插入lst2链表的firstPos标记的元素。
void ShowLst(int a)
{
	cout << a << " ";
}

int main()
{
	list<int> lst;
	lst.push_back(1);
	lst.push_back(2);
	lst.push_back(3);
	lst.push_back(4);
	lst.push_back(5);

	list<int> lst2;
	lst2.push_back(11);
	lst2.push_back(12);
	lst2.push_back(13);
	lst2.push_back(14);
	lst2.push_back(15);

	list<int>::iterator itePos = find(lst.begin(), lst.end(), 5);
	list<int>::iterator firstItePos = find(lst2.begin(), lst2.end(), 12);
	
	lst.splice(itePos, lst2, firstItePos);
	::for_each(lst.begin(), lst.end(), &ShowLst);
	cout << "=========================================" << endl;
	::for_each(lst2.begin(), lst2.end(), &ShowLst);
	cout << "=========================================" << endl;

	system("pause");
	return 0;
}
5.lst.splece(itePos, lst2, firstPos, lastPos):在lst的itePos位置插入lst2链表从firstPos到lastPos这一段。
void ShowLst(int a)
{
	cout << a << " ";
}

int main()
{
	list<int> lst;
	lst.push_back(1);
	lst.push_back(2);
	lst.push_back(3);
	lst.push_back(4);
	lst.push_back(5);

	list<int> lst2;
	lst2.push_back(11);
	lst2.push_back(12);
	lst2.push_back(13);
	lst2.push_back(14);
	lst2.push_back(15);

	list<int>::iterator itePos = find(lst.begin(), lst.end(), 5);
	list<int>::iterator firstItePos = find(lst2.begin(), lst2.end(), 12);
	list<int>::iterator endItePos = find(lst2.begin(), lst2.end(), 14);
	
	
	lst.splice(itePos, lst2, firstItePos, endItePos);
	::for_each(lst.begin(), lst.end(), &ShowLst);
	cout << "=========================================" << endl;
	::for_each(lst2.begin(), lst2.end(), &ShowLst);
	cout << "=========================================" << endl;

	system("pause");
	return 0;
}
6.lst.sort()是与lst.merge()

lst.sort()是将乱序的lst进行排序;
lst…merge()是将两个顺序的lst进行合并。

void ShowLst(int a)
{
	cout << a << " ";
}

int main()
{
	list<int> lst;
	lst.push_back(1);
	lst.push_back(2);
	lst.push_back(3);
	lst.push_back(4);
	lst.push_back(5);

	list<int> lst2;
	lst2.push_back(11);
	lst2.push_back(12);
	lst2.push_back(13);
	lst2.push_back(14);
	lst2.push_back(15);

	lst.merge(lst2);
	::for_each(lst.begin(), lst.end(), &ShowLst);
	cout << "=========================================" << endl;

	system("pause");
	return 0;
}
8.list和vector分别在什么时候使用

list当程序中一直在进行动态的添加删除元素的时候使用效率更高;
vector当知道程序大小时使用效率更高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值