vector的常见用法总结(find、assign、front、back等函数)
一、前言
但凡对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,count−1],
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,得到下图的效果:
总结:可解决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,得到下图的效果:
总结:可解决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;
}
};
上一篇: vector的begin的基本操作
下一篇: stl 数值算法