码迷,mamicode.com
首页 > 编程语言 > 详细

c++之vector

时间:2018-05-11 20:17:37      阅读:226      评论:0      收藏:0      [点我收藏+]

标签:循环输出   位置   nbsp   output   删除   基本操作   值方法   使用   oid   

一、vector基本操作  

 

  vector是动态数组,其元素可以是任意类型,比如下面是一个简单的例子,这个例子中,就会介绍到vector的创建、赋值、访问以及一些方法。

 

#include <iostream>
#include <windows.h>
#include <vector>
using namespace std;

void modify(vector< vector<int> > &ivec){
    // 在第一行的下标2处添加一个元素666
    ivec[0].insert(ivec[0].begin() + 2, 666);
    // 在第六行的下标1处删除一个元素
    ivec[5].erase(ivec[5].begin() + 1);
    // 删除最后一行
    ivec[9].clear();
}

int main() {
    vector< vector<int> > ivec;
    for (int i = 0; i < 10; i++) {
        vector<int> vec;
        for (int j = 0; j < 10; j++) {
            vec.push_back(i + j);
        }
        ivec.push_back(vec);
    }
    
    // 在第一行末尾添加一个元素
    ivec[0].push_back(999);

    // 将第二行末尾的两个元素删除
    ivec.at(1).pop_back();
    ivec.at(1).pop_back();

    // 直接访问
    for (int i = 0; i < ivec.size(); i++) {
        for (int j = 0; j < ivec[i].size(); j++) {
            cout << ivec[i][j] << " ";
        }
        cout << endl;
    }
    cout << endl;

    // 调用函数
    modify(ivec);

    // 使用指针访问
    vector< vector<int> >::iterator IE;
    vector<int>::iterator it;
    for (IE = ivec.begin(); IE != ivec.end(); IE++) {
        for (it = (*IE).begin(); it != (*IE).end(); it++) {
            cout << *it << " ";
        }
        cout << endl;
    }

    cout << endl;
    cout << ivec[0][10] << endl; // 999
    cout << ivec[0].at(10) << endl; // 999
    cout << ivec.at(0).at(10) << endl; // 999

    // 注意这里front/back和begin/end的区别,
    cout << ivec[0].front() << endl; // 即front返回的时第一行的第一个元素;而begin是迭代器,需要用*访问到元素
    cout << ivec[0].back() << endl; // 同样,back返回的时第一行的最后一个元素;而back是迭代器,需要用*访问到元素

    cout << ivec[0][1000] << endl;     //1398145138 越界!但是c++不会报错,就像过马路一样,不该过时,没人提醒你不该过,出了错自己扛。
    system("pause");
}

 

 

  最终结果如下:

0 1 2 3 4 5 6 7 8 9 999
1 2 3 4 5 6 7 8
2 3 4 5 6 7 8 9 10 11
3 4 5 6 7 8 9 10 11 12
4 5 6 7 8 9 10 11 12 13
5 6 7 8 9 10 11 12 13 14
6 7 8 9 10 11 12 13 14 15
7 8 9 10 11 12 13 14 15 16
8 9 10 11 12 13 14 15 16 17
9 10 11 12 13 14 15 16 17 18

0 1 666 2 3 4 5 6 7 8 9 999
1 2 3 4 5 6 7 8
2 3 4 5 6 7 8 9 10 11
3 4 5 6 7 8 9 10 11 12
4 5 6 7 8 9 10 11 12 13
5 7 8 9 10 11 12 13 14
6 7 8 9 10 11 12 13 14 15
7 8 9 10 11 12 13 14 15 16
8 9 10 11 12 13 14 15 16 17


9
9
9
0
999
1398145138

  即我们需要引入库文件 vector。 然后这里创建的是一个二维int型数组,对于元素,我们可以用[]访问,也可以用at()访问,但是前者在越界时不会提示。另外,vector支持迭代器,用起来会比较方便。vector与传统数组的区别在于vector不需要指定数组的打下,而是动态变化的。 另外,我们可以看到,可以使用push_back()和pop_back()方便的操作数组;使用insert()和erase()可以很容易地在任何位置添加或者删除数组; 使用begin()和end()可以获取到vector的迭代器;使用size()可以获得vector的大小。 更多详细内容可以看程序注释。

  而如果我们希望将之作为参数传入函数中调用应该怎么做呢?上述的modify就是一个例子,即我们将上面程序中两个循环输出之间的 insert和erase 封装为一个函数,然后直接调用即可,值得注意的是参数的变量名前要有 &,这样才能成功调用。 

 

 

二、vector赋初始值

  在上面的例子中,我们使用push_back给vector赋值,但是如果我们希望直接赋值呢,难道要用多个push_back吗?这显然是不合理的,所以,下面介绍几种赋值方法。

1、不带参数的构造函数初始化:

//初始化一个size为0的vector
vector<int> foo;

 

2、构造默认值的vector:

vector<int> arr(10); // 返回默认值为0,长度为10

  如果我们第二个参数也是一个数字,那么就是默认值:

vector<int> arr(10, 8); //长度为10,值全部为8

 

3、根据数组地址进行初始化:

 int a[5] = {88, 52, 36, 96, 7};
 vector<int> arr(a, a+5);

  如上,我们构建出来的vector长度为5,值和数组a的值相同。这种方法比较常用。

 

 

4、通过同类型的vector进行初始化:

vector<int> a(10, 8);
vector<int> arr(a);

如上,得到的arr和a是一样的。

 

5、使用insert初始化:

int a[6] = {6, 6, 6, 6, 6, 6};
vector<int> arr;
arr.insert(arr.begin(), a, a + 7);

 

 

  

三、vector算法

  在上面的例子中,我们对vector可以进行简单的操作,而除此之外,vector还提供了一些简单的算法供我们使用,比如vector元素的反转以及排序等等。

     在使用算法时,需要引入头文件:

#include<algorithm>

  接着,就可以使用下面的常见算法了。

 

1、reverse() - 元素反转。

   在引入algorithm库文件之后,直接使用reverse(vec.begin(), vec.end());即可实现反转功能,如下所示:

#include <iostream>
#include <algorithm>
#include <windows.h>
#include <vector>
using namespace std;
void output(vector<int> &arr) {
    vector<int>::iterator it;
    for (it = arr.begin(); it != arr.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;
}
int main() {
    int a[10] = {15, 85, 65, 12, 5};
    vector<int> arr(a, a+5);
    // 输出初始vector
    output(arr);
    // 反转
    reverse(arr.begin(), arr.end());
    // 输出反转之后的vector
    output(arr);
    system("pause");
}

  最终结果如下:

15 85 65 12 5
5 12 65 85 15 

  可见,通过reverse,成功实现了反转功能。 

  

2、 sort() - 元素排序

  同样,需要引入algorithm库文件,然后直接使用sort(vec.begin(), vec.end());即可实现vector的排序。如下:

#include <iostream>
#include <algorithm>
#include <windows.h>
#include <vector>
using namespace std;
void output(vector<int> &arr) {
    vector<int>::iterator it;
    for (it = arr.begin(); it != arr.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;
}
int main() {
    int a[10] = {15, 85, 65, 12, 5};
    vector<int> arr(a, a+5);
    // 输出初始vector
    output(arr);
    // 排序
    sort(arr.begin(), arr.end());
    // 输出排序之后的vector
    output(arr);
    system("pause");
}

  最终,实现了从小到大的排序:

15 85 65 12 5
5 12 15 65 85

  默认情况下是升序排序,如果我们希望降序排序,可以定义一个函数,如下:

#include <iostream>
#include <algorithm>
#include <windows.h>
#include <vector>
using namespace std;
void output(vector<int> &arr) {
    vector<int>::iterator it;
    for (it = arr.begin(); it != arr.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;
}
bool camp(int &a, int &b) {
    return a>b;
}
int main() {
    int a[10] = {15, 85, 65, 12, 5};
    vector<int> arr(a, a+5);
    // 输出初始vector
    output(arr);
    // 反转
    sort(arr.begin(), arr.end(), camp);
    // 输出反转之后的vector
    output(arr);
    system("pause");
}

  这样,最终的结果就是降序排序,如下:

15 85 65 12 5
85 65 15 12 5

 

 

  

  

  

 

 

 

 

 

 

 

 

 

 

  

  

 

c++之vector

标签:循环输出   位置   nbsp   output   删除   基本操作   值方法   使用   oid   

原文地址:https://www.cnblogs.com/zhuzhenwei918/p/9025713.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!