1.Vector(向量容器)


一.概述

Vectors 包含着一系列連續存儲的元素,其行為和數組類似。訪問Vector中的任意元素或從末尾添加元素都可以在常量級時間復雜度內完成,而查找特定值的元素所處的位置或是在Vector中插入元素則是線性時間復雜度

二.特點

1) 指定一塊如同數組一樣的連續存儲,但空間可以動態擴展。即它可以像數組一樣操作,並且可以進行動態操作。通常體現在push_back() pop_back();

2) 隨機訪問方便,它像數組一樣被訪問,即支持[ ] 操作符和vector.at();

3) 節省空間,因為它是連續存儲,在存儲數據的區域都是沒有被浪費的,但是要明確一點vector 大多情況下並不是滿存的,在未存儲的區域實際是浪費的;

4) 在內部進行插入、刪除操作效率非常低,這樣的操作基本上是被禁止的。Vector 被設計成只能在后端進行追加和刪除操作,其原因是vector 內部的實現是按照順序表的原理; 

5) 只能在vector 的最后進行push 和pop ,不能在vector 的頭進行push 和pop;

6) 當動態添加的數據超過vector 默認分配的大小時要進行內存的重新分配、拷貝與釋放,這個操作非常消耗性能。 所以要vector 達到最優的性能,最好在創建vector 時就指定其空間大小;

 

Vectors 包含着一系列連續存儲的元素,其行為和數組類似。訪問Vector中的任意元素或從末尾添加元素都可以在常量級時間復雜度內完成,而查找特定值的元素所處的位置或是在Vector中插入元素則是線性時間復雜度。

三.常用API

Constructors 構造函數
Operators 對vector進行賦值或比較
assign() 對Vector中的元素賦值
at() 返回指定位置的元素
back() 返回最末一個元素
begin() 返回第一個元素的迭代器
capacity() 返回vector所能容納的元素數量(在不重新分配內存的情況下)
clear() 清空所有元素
empty() 判斷Vector是否為空(返回true時為空)
end() 返回最末元素的迭代器(譯注:實指向最末元素的下一個位置)
erase() 刪除指定元素
front() 返回第一個元素
get_allocator() 返回vector的內存分配器
insert() 插入元素到Vector中
max_size() 返回Vector所能容納元素的最大數量(上限)
pop_back() 移除最后一個元素
push_back() 在Vector最后添加一個元素
rbegin() 返回Vector尾部的逆迭代器
rend() 返回Vector起始的逆迭代器
reserve() 設置Vector最小的元素容納數量
resize() 改變Vector元素數量的大小
size() 返回Vector元素數量的大小
swap() 交換兩個Vector

 

四.示例Demo

#include <iostream>
#include <vector>
#include <stdlib.h>

using namespace std;

#pragma warning(disable:4996)

struct Teacher {
    char name[20];
    int age;
};

void printfV(vector<int> &c) {

    int size = c.size();

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

void printfPTeacher(vector<Teacher *> &c) {

    int size = c.size();
    for (int i = 0; i < size; i++)
    {
        cout << "name is:" << c[i]->name << ", age is:" << c[i]->age << endl;
    }

}


void printfVTeacher(vector<Teacher> &c) {

    int size = c.size();
    for (int i = 0; i < size;i++) {
        cout << "name is: " << c[i].name << ", age is: " << c[i].age << endl;
    }

}



int main() {

    
    vector<int> v1(5);

    for (int i = 0; i < 5; i++)
    {
        v1[i] = i + 1;
    }

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


    printf("---------------------------------------\n");

    vector<int> v2(20);
    v2 = v1;

    printfV(v2);

    printf("---------------------------------------\n");

    // vector 會把20個元素全部初始化為0
    vector<int> v3(20);
    v3.push_back(100);
    v3.push_back(101);

    printfV(v3);
    printf("---------------------------------------\n");

    vector<Teacher> v4(3);
    Teacher t1, t2, t3;
    t1.age = 11;
    t2.age = 22;
    t3.age = 33;

    strcpy(t1.name,"Tom");
    strcpy(t2.name,"Jack");
    strcpy(t3.name,"Mike");

    v4[0] = t1;
    v4[1] = t2;
    v4[2] = t3;

    printfVTeacher(v4);


    printf("---------------------------------------\n");

    vector<Teacher *> v5(3);
    Teacher *p1 = (Teacher *)malloc(sizeof(Teacher));
    p1->age = 111;
    strcpy(p1->name,"Person1");


    Teacher *p2 = (Teacher *)malloc(sizeof(Teacher));
    p2->age = 222;
    strcpy(p2->name, "Person2");

    Teacher *p3 = (Teacher *)malloc(sizeof(Teacher));
    p3->age = 222;
    strcpy(p3->name, "Person3");

    

    v5[0] = p1;
    v5[1] = p2;
    v5[2] = p3;

    printfPTeacher(v5);


    
    system("pause");
    

    return 0;

}

運行結果:

1
2
3
4
5
---------------------------------------
1
2
3
4
5
---------------------------------------
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
100
101
---------------------------------------
name is: Tom, age is: 11
name is: Jack, age is: 22
name is: Mike, age is: 33
---------------------------------------
name is:Person1, age is:111
name is:Person2, age is:222
name is:Person3, age is:222

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM