迭代器失效__2018.05.27

在某个位置通过迭代器插入的时候,不能插入,:当前位置之后的迭代器失效了,当前位置之前的迭代器失效了。

insert(迭代器(位置),**)

erase删除有重载,可以按位置删除也可以按值删除。

迭代器提供了*运算符重载函数。

种随机数种子:srand(time(0));//以系统时间为种子种随机数。

srand(time(0));
for (int i = 0; i < 20; ++i)
{
vec1.push_back(rand() % 100);
}

泛型算法:指算法使用模板写的。

泛型算法=模板+迭代器+函数对象。

函数对象都在functional头文件中声明了。

有一个参数就叫一元函数对象,有两个参数就叫二元函数参数。

sort (vec.begin(),vec.end(),greater<int>());

find();都是找到就将该位置的迭代器返回,否则就返回end();

迭代器失效:删除后,从删除位置往后的迭代器就都失效了,需要将迭代器更新一下。

通过返回值对迭代器进行更新,可以解决迭代器失效问题。

指针可以直接加整数,标=表示指针偏移量。

迭代器之所以能够直接相减是因为底层数据结构是数组,地址的连续的,像链表这样的数据结构就没有办法直接用迭代器的相减,因为地址不连续。

一次拉一点一次拉一点,后面就成听天书了。

vector的增删改查、时间复杂度。修改之前得先查询,查询用迭代器。

不要想着总是补全代码。得弄懂。

底层数据结构、内存增长方式、增删该查方法。

运算符重载离不开容器、容器离不开运算符重载。

如果插入选择多了,就不选择容器。

自己写内存池。

vector初始的内存操作效率太低。默认内存的大小是0,插入一个是2插入两个是4......(0、1、2、4、8、16、32、64......)

vector的初始使用效率太低

如果频繁进行插入、选择,容器的效率会很低。

vec.reserve(100);//预留100大小的内存空间。预留100个空间。在使用之前,就知道大概要操作多少元素。可以改善初始操作效率不高的问题。就避免了内存的重新增长。

cur置为0;

vec.reserve:专门解决vector容器初始操作效率不高的问题。

单线程程序。

对象挪地方不好挪,得先开辟新内存,进行构造,再把之前的对象释放掉。

判断两个对象的空间配置器是否一样(内存管理方式)。

容器利用空间配置器来管理对象的构造析构、用迭代器来遍历容器。(因为每一个容器底层的数据结构不同,遍历的方法自然也不一样。)

每一个容器都有:first、last、end。

内存没有改,不牵扯对象的构造析构。

空间配置器(allocator):容器内存的管理当时,对象的构造析构。

vec.reserve返回的是元素的个数,而不是空间的大小。

vec.empty();//判断容器是否为空。

vector向量容器。

几个接口:就是类的public函数。

gcc链接的是c库、g++链接的c++库。

yum仓库(c++的软件仓库),rpm就是软件。

可以直接使用c++代码。提高编译效率。

g++能不能编译c代码。gcc能不能编译c++代码。

自己动手写,不要什么都让老师来解答。

迭代器的失效问题。

如何在类模板中将类的类型萃取出来,

template<typename T>

typedef T value_type;

通过这个做法就可以将模板类型参数保留下来。

用继承的方式,就可以将这个类型保留下来。(代码的复用。)

这都是一些套路。

深拷贝、浅拷贝。

将构造函数私有化,用户就不能让用户进行操作。

避免用户使用构造和拷贝构造。

构造函数不能写成私有的。

new一个MyTest对象。

派生类只会对自己这部分的对象进行构造和复制,基类部分需要掉基类的方法去实现。

单例模式实现就是将对象的构造函数私有化。

派生类对象的构造是先构造基类,在构造派生类自己的部分。

学东西,要在用的时候能够使用它,不会使用,看再多,也是爱做无用功,方法不正确。

案例使用场景理解了,再去看理论,才有用。

STL库中只有二元函数对象。

小括号运算符重载函数。

c++ STL 库比较元素大小相关的函数对象,只有二元的函数对象。

c++ STL库里面函数对象的另一个应用。

绑定器  都是绑定高元函数对象    高元的函数对象+绑定器-->低元的函数对象

bindlst =》把二元函数对象的的operator()函数的第一个参数进行绑定。

bind2nd=》把二元函数对象的的operator()函数的第二个参数进行绑定。


比较大于40的值。绑定第一个参数。

绑定器实现。

template<typename T>

typedef T valuel_type;

template<typename T>

传一个函数对象和一个参数,

类模板在使用的时候,尖括号不能省略。

库里面没有一元函数对象,只有一个绑定器。

不要去记,要根据使用的地方去理解它。

绑定器对象。

一元函数对象有一个值,又利用绑定器绑定了一个值,所以就是两个值,也就是二元函数对象了。

小括号运算符重载函数,小括号不能把丢。

绑定器:能不能理解?绑定器就是函数对象的使用,结合二元函数对象,实现一元函数对象,在泛型算法中使用。

取反器:给一元函数对象取反器mynot1的实现。

封装函数模板可以让系统自动推演函数类型。

// 50 < b   ! falase   给一元函数对象的取反器 mynot1的实现
	it = myfind_if(vec1.begin(), vec1.end(), mynot1(mybind1st(MyLess<int>(), 50)));
	if (it == vec1.end())
	{
		cout << "not found!" << endl;
	}
	else
	{
		cout << "第一个比40小的数字是:" << *it << endl;
	}


猜你喜欢

转载自blog.csdn.net/weixin_40316053/article/details/80470536