vetor(一)

vector是表示可变大小数组的序列容器。

1.vector定义(构造)

void vector6()
{
	
	
		// constructors used in the same order as described above:
		vector<int> first;                                // 构造空vector对象
		vector<int> second(4, 100);                       // 进行构造同时进行初始化 这里生成的对象会有4个100的元素
		vector<int> third(second.begin(), second.end());  // 这里是使用second对象的迭代器进行初始化
		vector<int> fourth(third);          // 拷贝构造
		int myints[] = { 16,2,77,29 };
		std::vector<int> fifth(myints, myints + sizeof(myints) / sizeof(int)); 

}
int main()
{
	vector<int>v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(1);
	v1.push_back(5);
	v1.push_back(6);
	v1.push_back(1);

	return 0;
}

vector容器的定义和尾插数据

vector容器的遍历

通过重载[]进行访问

int main()
{
	vector<int>v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(1);
	v1.push_back(5);
	v1.push_back(6);
	v1.push_back(1);
	for (size_t i = 0 ; i < v1.size();i++)
	{
		cout << v1[i] << " ";
	}
	cout << endl;
	return 0;
}

vector容器可以储存很多类型

void vector1()
{
	vector<int> v1;
	vector<double> v1;
	vector<char> v1;
	vector<vector<int>> v1;
	vector<string> v1;
	

}

那么vector<char>和string的区别是什么  是否vector<char>能否代替string呢

是不能的 string既可以插入字符也可以插入字符串 而vector<char>只能插入字符无法插入字符串

string和vector<char>的底层非常相似 但是接口不同 如append +=这样的接口vector是没有的

string是专门针对字符串数组设计的 而vector是根据所有类型设计的 两者不相同

不能替代

vector使用迭代器进行变量

void vector2()
{
	vector<int>v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(1);
	v1.push_back(5);
	v1.push_back(6);
	v1.push_back(1);
	/*for (size_t i = 0; i < v1.size(); i++)
	{
		cout << v1[i] << " ";
	}
	cout << endl;*/
	vector<int>::iterator e = v1.begin();
	while (e!=v1.end())
	{
		cout << *e << " ";
		e++;
	}
	cout << endl;
}

使用范围for对vector进行遍历

void vector2()
{
	vector<int>v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(1);
	v1.push_back(5);
	v1.push_back(6);
	v1.push_back(1);
	/*for (size_t i = 0; i < v1.size(); i++)
	{
		cout << v1[i] << " ";
	}
	cout << endl;*/
	/*vector<int>::iterator e = v1.begin();
	while (e!=v1.end())
	{
		cout << *e << " ";
		e++;
	}
	cout << endl;*/
	for (auto e : v1)
	{
		cout << e << " ";
	}
	cout << endl;
}

void vector3()
{
	vector<string>v1;
	string s1("张三");
	v1.push_back(s1);//有名对象

	v1.push_back(string("呵呵"));//匿名对象

	v1.push_back("哈哈");//隐式类型转换  这里有问题

	for (const auto & e : v1)//string类型的vector遍历这里可以修改一下
	{
		cout << e << " ";
	}
	cout << endl;
}

这里的范围for遍历 相当于e = *it 每次都进行一次深拷贝 如果加上引用那么就会减少很多损耗 如果不修改还可以再前面加上const

vector的begin是指向数组的第一个元素 而end是指向数组最后一个元素的下一个

对vector进行排序 可以使用sort (算法配合vector进行使用)

sort是存在algorithm库中的  它是一个函数模版  它的参数传的是函数的迭代器

void vector4()
{
	vector<int>v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(12);
	v1.push_back(5);
	v1.push_back(6);
	v1.push_back(10);
	v1.push_back(100);
	v1.push_back(19);
	v1.push_back(41);
	v1.push_back(55);
	v1.push_back(7);
	sort(v1.begin(),v1.end());

	for (auto e:v1)
	{
		cout << e << " ";
	}
	cout << endl;
}

如果是想要跳开第一个和最后一个进行排序则要调整sort中的参数

void vector4()
{
	vector<int>v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(12);
	v1.push_back(5);
	v1.push_back(6);
	v1.push_back(10);
	v1.push_back(100);
	v1.push_back(19);
	v1.push_back(41);
	v1.push_back(55);
	v1.push_back(7);
	sort(v1.begin()+1,v1.end()-1);

	for (auto e:v1)
	{
		cout << e << " ";
	}
	cout << endl;
}

void vector4()
{
	vector<int>v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(12);
	v1.push_back(5);
	v1.push_back(6);
	v1.push_back(10);
	v1.push_back(100);
	v1.push_back(19);
	v1.push_back(41);
	v1.push_back(55);
	v1.push_back(7);
	//sort(v1.begin(),v1.end());
	//sort(v1.begin()+1,v1.end()-1);
	sort(v1.begin(),v1.begin()+v1.size()/2);//这里根据改变参数来改变排序范围 非常灵活
	for (auto e:v1)
	{
		cout << e << " ";
	}
	cout << endl;

}

这里的排序都是升序(默认) 那么该如何进行降序比较呢

可以将greater仿函数作为sort的第三个参数来改变sort的升序变为降序

void vector4()
{
	vector<int>v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(12);
	v1.push_back(5);
	v1.push_back(6);
	v1.push_back(10);
	v1.push_back(100);
	v1.push_back(19);
	v1.push_back(41);
	v1.push_back(55);
	v1.push_back(7);
	greater<int>gt;//仿函数
	sort(v1.begin(),v1.end(),gt);
	//sort(v1.begin()+1,v1.end()-1);
	//greater<int>gt;//仿函数
	//sort(v1.begin(),v1.begin()+v1.size()/2,gt);//这里根据改变参数来改变排序范围 非常灵活
	for (auto e:v1)
	{
		cout << e << " ";
	}
	cout << endl;

}

void vector5()
{
	greater<int> gt;//这个仿函数是这个类型的对象 可以支持比较大小
	cout<<gt(3,2)<<endl;
cout<<	gt(2,3)<<endl;

}

除了greater之外还有less也是仿函数

为什么仿函数的这个对象能够像函数一样去调用?

void vector5()
{
	greater<int> gt;//这个仿函数是这个类型的对象 可以支持比较大小
	cout<<gt(3,2)<<endl;
	cout << gt.operator()(3, 2) << endl;//为什么这个对象能够像函数一样去调用的本质
cout<<	gt(2,3)<<endl;

}

size 和 capacity 可以查看当前vector 的有效数组大小 和总的空间大小

empty可以判断容器是否为空

如果 n 小于当前容器大小,则内容将减少到其前 n 个元素,删除超出此部分的元素(并销毁它们)。

如果 n 大于当前容器大小,则通过在末尾插入所需数量的元素来扩展内容,以达到 n 的大小。如果指定了 val ,则新元素将初始化为 val 的副本,否则,它们将进行值初始化。

如果 n 也大于当前容器容量,则会自动重新分配分配的存储空间。

void vector7()
{
	std::vector<int> myvector;

	// set some initial content:
	for (int i = 1; i < 10; i++) myvector.push_back(i);

	myvector.resize(5);
	myvector.resize(8, 100);
	myvector.resize(12);

	std::cout << "myvector contains:";
	for (int i = 0; i < myvector.size(); i++)
		std::cout << ' ' << myvector[i];
	std::cout << '\n';
}

reserve可以改变容器的空间大小

请求容量至少足以包含 n 个元素。

如果 n 大于当前容量,则该函数会导致容器重新分配其存储,将其容量增加到 n(或更大)。

在所有其他情况下,函数调用不会导致重新分配,并且容量不受影响。

void vector8()
{
	vector<int>v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(1);
	v1.push_back(5);
	v1.push_back(6);
	v1.push_back(1);
	/*for (size_t i = 0; i < v1.size(); i++)
	{
		cout << v1[i] << " ";
	}
	cout << endl;*/
	/*vector<int>::iterator e = v1.begin();
	while (e!=v1.end())
	{
		cout << *e << " ";
		e++;
	}
	cout << endl;*/
	for (auto e : v1)
	{
		cout << e << " ";
	}
	cout << endl;
	v1.pop_back();
	v1.pop_back();
	v1.pop_back();
	for (auto e : v1)
	{
		cout << e << " ";
	}
	cout << endl;
}

从容器中删除单个元素 (位置) 或一系列元素 ([first,last))

void vector9()
{
	vector<int>v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(1);
	v1.push_back(5);
	v1.push_back(6);
	v1.push_back(1);
	for (auto e : v1)
	{
		cout << e << " ";
	}
	cout << endl;
	v1.insert(v1.begin(), 5); //插入一个数据
	for (auto e : v1)
	{
		cout << e << " ";
	}
	cout << endl;
	v1.insert(v1.begin(), 5,100);//填充
	for (auto e : v1)
	{
		cout << e << " ";
	}
	cout << endl;
	vector<int> vv;
	vv.insert(vv.begin(),v1.begin(),v1.end());//范围插入
	for (auto e : vv)
	{
		cout << e << " ";
	}
	cout << endl;
}

用 x 的内容交换容器的内容,x 是另一个相同类型的矢量对象。大小可能有所不同。

调用此成员函数后,此容器中的元素是调用之前位于 x 中的元素,而 x 的元素是 this 中的元素。所有迭代器、引用和指针对于交换的对象仍然有效

这个是算法模块实现,不是vector的成员接口

一共有三个参数 第一个和第二个表示查找范围  第三个表示要查找的值 若是能找到则返回对应位置的值

void vector10()
{
	int myints[] = { 10, 20, 30, 40 };
	int* p;

	p = std::find(myints, myints + 4, 30);
	if (p != myints + 4)
		std::cout << "Element found in myints: " << *p << '\n';
	else
		std::cout << "Element not found in myints\n";

	// using std::find with vector and iterator:
	std::vector<int> myvector(myints, myints + 4);
	std::vector<int>::iterator it;

	it = find(myvector.begin(), myvector.end(), 30);
	if (it != myvector.end())
		std::cout << "Element found in myvector: " << *it << '\n';
	else
		std::cout << "Element not found in myvector\n";

}

这里数组使用指针确定范围 同时返回的是对应位置的指针

而vector容器是通过迭代器确定范围 返回的也是对应位置的迭代器

如果没找到 就会返回到查找范围的最后一个元素的位置 

查找的范围应该设置左闭右开 即右边应该是有效元素的下一个位置作为边界

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值