欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

vector的常见用法总结(find、assign、front、back等函数)

程序员文章站 2022-03-01 23:18:39
...

一、前言
但凡对C++STL了解的小伙伴,大多已经熟知vector的如下用法:
(0)vector头文件

#include <vector>
using namespace std;

(1)vector的定义
vector<typename> name;
eg:

vector<int> V;

(2)vector容器内元素的访问
①通过下标访问
和访问普通素数一样:
V [ i ] , i ∈ [ 0 , c o u n t − 1 ] V[i], i\in[0, count - 1] V[i],i[0,count1],

count指V中元素的个数,见下文(3)⑤。

②通过迭代器访问
vector<typename>::iterator it;
eg:

vector<int>::iterator it;

一般的使用场景:

for (auto it = V.begin(); it != V.end(); it++) {
        cout << *it << " ";
    }

用于按从左到右的顺序遍历vector中的元素。
对于vector,可以把V.begin()理解为指向第1个元素的指针,所以*it便为第1个元素的值。

vector<int>::iterator it= V.begin(); 有些麻烦,改为auto it = V.begin();

(3)vector的常用函数
①begin(), end()
begin() : 返回vector第1个元素的迭代器(iterator);
end() : 返回vector最后1个元素下一个位置的迭代器;

②push_back()
push_back(x)在vector后面添加一个元素x。
eg:

V.push_back(5);

③pop_back()
用以删除vector的尾元素。

V.pop_back();

④insert()
insert(it, x)用来向vector的任意迭代器it处插入一个元素x。
eg:

V.insert(V.begin() + 2, -1);

在V[2]处插入-1,原来的V[2]及其后元素均后移1个位置。

⑤size()
用来获得vector中元素的个数。
eg:

int count = V.size();

⑥clear()
用来清空vector中的所有元素。
eg:

V.clear();

⑦erase()
删除单个元素:erase(it)即删除迭代器为it处的元素
eg:

V.erase(V.begin());

删除一个区间内的所有元素 : erase(first, last)即删除[first, last)内的所有元素。(左闭右开)
eg:

V.erase(V.begin(), V.end());

二、刷LeetCode时,积累的用法
1.find()
①需要头文件

#include <algorithm>

②示例

 auto it = find(V.begin(), V.end(), 3);

①返回执行需查找元素的迭代器(it),若没有找到则it == end()。
②查找区间,左闭右闭

2.assign()
拷贝vector[first, last)区间的元素。
eg:

vector<int> V2;
V2.assign(V.begin(), V.begin() + 1);

左闭右开!

总结:由find()和assign()可解决LeetCode 105. 从前序与中序遍历序列构造二叉树
AC代码如下:

class Solution {
public:
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        if(preorder.size() == 0) return NULL;
        TreeNode *root = new TreeNode(preorder[0]);
        //左右子树的前序遍历和中序遍历;
        auto mid = find(inorder.begin(), inorder.end(), preorder[0]);
        vector<int> leftPreorder, leftInorder, rightPreorder, rightInorder; 
        //左子树的中序遍历
        leftInorder.assign(inorder.begin(), mid);
        //左子树的前序遍历
        leftPreorder.assign(preorder.begin() + 1, preorder.begin() + 1 + leftInorder.size());
        //右子树的前序遍历
        rightPreorder.assign(preorder.begin() + 1 + leftInorder.size(), preorder.end());
        //右子树的中序遍历
        rightInorder.assign(mid + 1, inorder.end());
        root->left = buildTree(leftPreorder, leftInorder);
        root->right = buildTree(rightPreorder, rightInorder);
        return root;
    }
};

3.front()
返回vector中起始元素的引用
eg:

#include <vector>
#include <cstdio>
using namespace std;

int main() {
    vector<vector<int>> ans;
    vector<int> numbers = {1, 2};
    ans.push_back(numbers);
    ans.insert(ans.begin(), vector<int>());
    ans.front().push_back(3);
    return 0;
}

ans.front()返回vector起始元素的引用,即空的vector,然后将3加入到vector,得到下图的效果:
vector的常见用法总结(find、assign、front、back等函数)

总结:可解决LeetCode 107. 二叉树的层次遍历 II
AC代码如下:

class Solution {
public:
    vector<vector<int>> levelOrderBottom(TreeNode* root) {
        vector<vector<int> > ans;
        if(root == NULL) return ans;
        queue<TreeNode *> Q;
        Q.push(root);
        while(!Q.empty()) {
            int count = Q.size();
            ans.insert(ans.begin(), vector<int>());
            for(int i = 0; i < count; i++) {
                TreeNode *temp = Q.front();
                Q.pop();
                ans.front().push_back(temp->val);
                if(temp->left != NULL) Q.push(temp->left);
                if(temp->right != NULL) Q.push(temp->right);
            }
        }
        return ans;
    }
};

4.back()
返回vector中末尾元素的引用
eg:

#include <vector>
#include <cstdio>
using namespace std;

int main() {
    vector<vector<int>> ans;
    vector<int> numbers = {1, 2};
    ans.push_back(numbers);
    ans.insert(ans.begin(), vector<int>());
    ans.back().push_back(3);
    return 0;
}

ans.back()返回vector末尾元素的引用,即numbers,然后将3加入到numbers,得到下图的效果:
vector的常见用法总结(find、assign、front、back等函数)

总结:可解决LeetCode 103. 二叉树的锯齿形层次遍历
AC代码如下:

class Solution {
public:
    vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
        vector<vector<int> > ans;
        if(root == NULL) return ans;
        queue<TreeNode *> Q;
        Q.push(root);
        int layer = 1;
        while(!Q.empty()) {
            int count = Q.size();
            ans.push_back(vector<int>());
            for(int i = 0; i < count; i++) {
                TreeNode *temp = Q.front();
                Q.pop();
                if(layer % 2) ans.back().push_back(temp->val);  //后插,即从左往右遍历
                else ans.back().insert(ans.back().begin(), temp->val); //前插,即从右往左遍历
                if(temp->left) Q.push(temp->left);
                if(temp->right) Q.push(temp->right);
            }
            layer++;
        }
        return ans;
    }
};