vector存放内置数据类型

容器: vector

算法: for_each

迭代器: vector<int>::iterator

一、创建vector容器对象

创建Vector的时候需要通过模板参数指定容器在红存放的数据类型
语法:

vector v;

注:指定该vector存放的数据类型为type,该容易的名称为 v

二、遍历vector容器

每一个容易都有自己的迭代器,迭代器是用来遍历容器中的元素
v.begin() 返回一个迭代器,指向容器中的第一个元素。
v.end() 返回一个迭代器,指向容器中最后一个元素的下一个位置。
vector::iterator 拿到 vector这种容器的迭代器类型

1、迭代器 while循环

判断两个迭代器不相等的时候就打印其中的数据

  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. using namespace std;
  5. vector<int>v;
  6. int main(){
  7. v.push_back(10);
  8. v.push_back(20);
  9. v.push_back(30);
  10. v.push_back(40);
  11. vector<int>::iterator vBegin = v.begin();
  12. vector<int>::iterator vEnd = v.end();
  13. while(vBegin != vEnd){
  14. cout << *vBegin << endl;
  15. vBegin++;
  16. }
  17. return 0;
  18. }

image.png

2、迭代器 for循环

  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. using namespace std;
  5. vector<int>v;
  6. int main(){
  7. v.push_back(10);
  8. v.push_back(20);
  9. v.push_back(30);
  10. v.push_back(40);
  11. vector<int>::iterator vBegin = v.begin();
  12. vector<int>::iterator vEnd = v.end();
  13. for(vector<int>::iterator begin = v.begin(); begin < v.end();begin++){
  14. cout << *begin << endl;
  15. }
  16. return 0;
  17. }

image.png

3、STL算法中的for_each方法

  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. using namespace std;
  5. vector<int>v;
  6. void func(int val){
  7. cout << val << endl;
  8. }
  9. int main(){
  10. v.push_back(10);
  11. v.push_back(20);
  12. v.push_back(30);
  13. v.push_back(40);
  14. for_each(v.begin(),v.end(),func);
  15. return 0;
  16. }

image.png
for_each() 函数的原型

  1. template<typename _InputIterator, typename _Function>
  2. _Function
  3. for_each(_InputIterator __first, _InputIterator __last, _Function __f)
  4. {
  5. // concept requirements
  6. __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
  7. __glibcxx_requires_valid_range(__first, __last);
  8. for (; __first != __last; ++__first)
  9. __f(*__first);
  10. return _GLIBCXX_MOVE(__f);
  11. }

image.png

三、vector容器存储自定义数据

学习目标:vector中存放自定义数据类型,并打印输出

  1. #include <vector>
  2. #include <string>
  3. //自定义数据类型
  4. class Person {
  5. public:
  6. Person(string name, int age) {
  7. mName = name;
  8. mAge = age;
  9. }
  10. public:
  11. string mName;
  12. int mAge;
  13. };
  14. //存放对象
  15. void test01() {
  16. vector<Person> v;
  17. //创建数据
  18. Person p1("aaa", 10);
  19. Person p2("bbb", 20);
  20. Person p3("ccc", 30);
  21. Person p4("ddd", 40);
  22. Person p5("eee", 50);
  23. v.push_back(p1);
  24. v.push_back(p2);
  25. v.push_back(p3);
  26. v.push_back(p4);
  27. v.push_back(p5);
  28. // vector 后面尖括号中的数据类型是什么,迭代器的数据类型就是什么
  29. for (vector<Person>::iterator it = v.begin(); it != v.end(); it++) {
  30. cout << "Name:" << (*it).mName << " Age:" << (*it).mAge << endl;
  31. }
  32. }
  33. //放对象指针
  34. void test02() {
  35. vector<Person*> v;
  36. //创建数据
  37. Person p1("aaa", 10);
  38. Person p2("bbb", 20);
  39. Person p3("ccc", 30);
  40. Person p4("ddd", 40);
  41. Person p5("eee", 50);
  42. v.push_back(&p1);
  43. v.push_back(&p2);
  44. v.push_back(&p3);
  45. v.push_back(&p4);
  46. v.push_back(&p5);
  47. for (vector<Person*>::iterator it = v.begin(); it != v.end(); it++) {
  48. Person * p = (*it);
  49. cout << "Name:" << p->mName << " Age:" << (*it)->mAge << endl;
  50. }
  51. }
  52. int main() {
  53. test01();
  54. test02();
  55. system("pause");
  56. return 0;
  57. }

四、Vector容器的嵌套使用

学习目标:容器中嵌套容器,我们将所有数据进行遍历输出

  1. #include <vector>
  2. //容器嵌套容器
  3. void test01() {
  4. vector< vector<int> > v;
  5. vector<int> v1;
  6. vector<int> v2;
  7. vector<int> v3;
  8. vector<int> v4;
  9. for (int i = 0; i < 4; i++) {
  10. v1.push_back(i + 1);
  11. v2.push_back(i + 2);
  12. v3.push_back(i + 3);
  13. v4.push_back(i + 4);
  14. }
  15. //将容器元素插入到vector v中
  16. v.push_back(v1);
  17. v.push_back(v2);
  18. v.push_back(v3);
  19. v.push_back(v4);
  20. for (vector<vector<int> >::iterator it = v.begin(); it != v.end(); it++) {
  21. // it 是一个 类型为vector<int>的迭代器
  22. for (vector<int>::iterator vit = (*it).begin(); vit != (*it).end(); vit++) {
  23. // 再对it进行一次操作,得到的就是一个类型为 int 的vit迭代器
  24. cout << *vit << " ";
  25. }
  26. //这样就可以遍历出每一个vector中的所有数据
  27. cout << endl;
  28. }
  29. }
  30. int main() {
  31. test01();
  32. system("pause");
  33. return 0;
  34. }

五、vector容器的内置几种方法

1、跟插入和删除相关的

函数原型:

  • push_back(ele); //尾部插入元素ele
  • pop_back(); //删除最后一个元素
  • insert(const_iterator pos, ele); //迭代器指向位置pos插入元素ele
  • insert(const_iterator pos, int count,ele);//迭代器指向位置pos插入count个元素ele
  • erase(const_iterator pos); //删除迭代器指向的元素
  • erase(const_iterator start, const_iterator end);//删除迭代器从start到end之间的元素
  • clear(); //删除容器中所有元素

    2、跟容量和大小相关的

    函数原型:

  • empty(); //判断容器是否为空

  • capacity(); //容器的容量
  • size(); //返回容器中元素的个数
  • resize(int num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。
    //如果容器变短,则末尾超出容器长度的元素被删除。
  • resize(int num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。
    //如果容器变短,则末尾超出容器长度的元素被删除

    3、跟数据存取相关的

    函数原型:

  • at(int idx); //返回索引idx所指的数据

  • operator[]; //返回索引idx所指的数据
  • front(); //返回容器中第一个数据元素
  • back(); //返回容器中最后一个数据元素

    4、跟数据交换相关的

功能描述:

  • 实现两个容器内元素进行互换

函数原型:

  • swap(vec); // 将vec与本身的元素互换