目录
常用
vector<int> vec;
vec.size(); // 实际元素个数
vec.begin(); // 指向第一项
vec.end(); // 指到最尾有效元素的下一位
vec.front(); // 第一项值
vec.back(); // 最后一项值
vec.empty(); // 判断是否为空
vec.clear(); // 清空
初始化
可以通过数组、vector进行初始化。注意:vector的begin和end使用,vector.end()。左闭右开。
vector<int> myVec; // 默认为空
vector<int> myVec(7); // 初始化为7个0
vector<int> myVec(7, 4); // 初始化为7个4
// 通过数组初始化,指明首位地址,不包含end
int myList[] = { 32, 71, 12, 45, 26, 80, 53, 33 };
std::vector<int> listVec(myList+1, myList+5); // 71 12 45 26
std::vector<int> listVec2(std::begin(myList)+1, std::end(myList)); // 71 12 45 26 80 53 33
// 通过迭代器初始化
std::vector<int> iterVec(listVec2.begin()+1, listVec2.end()-2); // 12 45 26 80
// 通过vector初始化
std::vector<int> vecVec(iterVec); // 12 45 26 80
std::vector<int> vecVec2 = iterVec; // 12 45 26 80
for (auto ve : vecVec) {
std::cout<< ve << ' ';
}
std::cout<< std::endl;
迭代器
#include <iostream>
#include <vector>
#include <iterator>
// 声明
std::vector<int>::iterator it;
std::vector<int> vec;
// 遍历
for (std::vector<int>::iterator it=vec.begin(); it != vec.end(); it++) {
std::cout << *it << endl;
...
}
// 迭代器效果类似于指针
插入元素
末尾添加:push_back(); 每次添加新元素时,vector会将已有元素拷贝至新地址,清空旧内存,添加新元素,保证新分配的内存够用。
任意插入:insert;
#include<vector>
#include<iostream>
using namespace std;
int main()
{
vector<int> v(3);
v[0]=2;
v.push_back(1);
v.push_back(3);
v.insert(v.begin(),8); //在最前面插入新元素。
v.insert(v.begin()+2,1); //在迭代器中下标为2处插入新元素1
v.insert(v.end(),3); //在向量末尾追加新元素。
v.insert(v.end(),4,1); //在尾部插入4个1
int a[] = {1,2,3,4};
v.insert(v.end(),a[1],a[3]); //在尾部插入a[1]个a[3]
vector<int>::iterator it;
for(it=v.begin(); it!=v.end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
return 0;
}
删除元素
末尾删除:pop_back();
删除指定位置元素:erase();
删除后会改变vector大小。
remove不会改变大小
vector<int> v;
v.push_back(3); // 3
v.push_back(4); // 3 4
v.insert(v.begin()+2, 5); // 3 4 5
vector<int>::iterator itpop = v.end()-1;
cout << *itpop << endl; // 5
v.pop_back(); // 3 4
v.insert(v.end(), 6); // 3 4 6
v.erase(v.begin() + 1); // 3 6
v.erase(v.begin(), v.end()); //删除所有项
vector<int> iterator itera = v.end()-1;
v.erase(itera); //3
vector<int> iterator ite = remove(v.begin(), v,end(), 3);
// remove后v.size() 不会变
取最值
用法:max_element(v.begin(), v.end()); 或 max_element(std::begin(v), std::end(v)) ;
注意:max_element 、min_element 返回的是vector<double>::iterator。取最值要加 *。取下标要 distance(v.begin(), biggest);
#include <algorithm>
#include <iostream>
int main()
{
std::vector<double> v {1.0, 2.0, 3.0, 4.0, 5.0, 1.0, 2.0, 3.0, 4.0, 5.0};
// 两种用法
std::vector<double>::iterator biggest = std::max_element(std::begin(v), std::end(v));
std::vector<double>::iterator biggest = std::max_element(v.begin(), v.end());
auto smallest = std::min_element(v.begin(), v.end());
std::cout << "Max element is " << *biggest<< " at position " << std::distance(std::begin(v), biggest) << std::endl;
std::cout << "Min element is " << *smallest<< " at position " << std::distance(std::begin(v), smallest) << std::endl;
}
输出:
Max element is 5 at position 4
Min element is 1 at position 0
查找元素
#include <algorithm>
using std::count;
vector<int> v{ 4, 7, 9, 1, 2, 5 };
// count 遍历整个数组,返回bool
if (count(v.begin(), v.end(), key)) { }
// find 找到后立即返回,内部通过迭代器==对比实现, auto it2 = find(v.begin(), v.end(), key);
std::vector<int>::iterator it1;
if (find(v.begin(), v.end(), key) != v.end()) {
return true;
}
// binary_search() 对有序数组二分查找,返回bool型,O(logN)
sort(v.begin(), v.end());
if (binary_search(v.begin(), v.end(), key)) {
}
合并
vector<int> v1 = {1,23,4,5,6,67};
vector<int> v2 = {3,4,5,6,67,7};
vector<int> v3;
vector<int> v4;
vector<int> v5;
vector<int> v6;
// insert 从v3末尾开始插入
v3.insert(v3.end(), v1.begin(), v1.end()); // 1 23 4 5 6 67
v3.insert(v3.end(), v2.begin(), v2.end()); // 1 23 4 5 6 67 3 4 5 6 67 7
// copy 必须保证目的数组长度够大
v4.resize(v3.size());
std::copy(v3.begin(), v3.end(), v4.begin()); // 1 23 4 5 6 67 3 4 5 6 67 7
// copy 情形2
v4.resize(v3.size() + 3);
std::copy(v3.begin(), v3.end()-3, v4.begin()); // 1 23 4 5 6 67 3 4 5 0 0 0 0 0 0
std::copy(v3.begin(), v3.end(), v4.begin()); // 1 23 4 5 6 67 3 4 5 6 67 7 0 0 0
// merge 必须保证目的数组长度够大
v5.resize(v1.size() + v2.size());
std::merge(v1.begin(), v1.end(), v2.begin(), v2.end(), v5.begin()); // 1 3 4 5 6 23 4 5 6 67 67 7
v6.resize(v1.size() + v2.size());
std::merge(v1.begin()+3, v1.end(), v2.begin()+2, v2.end(), v6.begin()); // 5 5 6 6 67 67 7 0 0 0 0 0
排序
用法:sort(v.begin(), v.end(),less<int>()); 默认为升序。
注意:sort中最后一项的理解 less:从小开始,升序,greater:从大开始,降序。rbegin() = reverse begin,rend() = reverse end()。
#include <iostream>
#include <string>
#include <vector>
#include <algorithm> //std::sort()
int main()
{
int nums[] = {32,71,12,45,26,80,53,33};
vector<int> vc (nums, nums+8); // 初始化
std::cout << "init :";
for (std::vector<int>::iterator it=vc.begin(); it!=vc.end(); ++it)
std::cout << ' ' << *it;
std::cout << '\n';
// sort默认升序:
std::sort(vc.begin(), vc.end());
// 等效于
std::sort(vc.begin(), vc.end(), less<int>()); // 12 26 32 33 45 53 71 80
std::cout << " less :";
for (std::vector<int>::iterator it=vc.begin(); it!=vc.end(); ++it)
std::cout << ' ' << *it;
std::cout << '\n';
// sort降序:
std::sort(vc.rbegin(), vc.rend()); // 80 71 53 45 33 32 26 12
// 等效于
std::sort(vc.begin(), vc.end(), greater<int>()); // 80 71 53 45 33 32 26 12
std::cout << " greater :";
for (std::vector<int>::iterator it=vc.begin(); it!=vc.end(); ++it)
std::cout << ' ' << *it;
std::cout << '\n';
// 翻转
std::reverse(arr.begin(),arr.end());
}
// 特殊用法
std::sort(vc,begin(), vc.begin()+4);
bool myfunction (int i,int j)
{
return (i<j);
}
struct myclass {
bool operator() (int i,int j) { return (i<j);}
} myobject;
std::sort(myvector.begin()+4, myvector.end(), myfunction);
std::sort (myvector.begin(), myvector.end(), myobject);
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
struct Point2
{
int x;
int y;
};
bool GreaterSort (Point2 a,Point2 b) { return (a.x>b.x); }
bool LessSort (Point2 a,Point2 b) { return (a.x<b.x); }
int main()
{
vector<Point2> aaa;
Point2 temp;
temp.x=1;
temp.y=1;
aaa.push_back(temp);
temp.x=2;
temp.y=2;
aaa.push_back(temp);
temp.x=3;
temp.y=3;
aaa.push_back(temp);
sort(aaa.begin(),aaa.end(),GreaterSort);//降序排列
cout<<"Greater Sort:"<<endl;
for (int i =0;i<aaa.size();i++)
{
cout<<aaa[i].x<<" "<<aaa[i].y<<endl;
}
sort(aaa.begin(),aaa.end(),LessSort);//升序排列
cout<<"Less Sort:"<<endl;
for (int i =0;i<aaa.size();i++)
{
cout<<aaa[i].x<<" "<<aaa[i].y<<endl;
}
return 0;
}
举例
// sort algorithm example
#include <iostream> // std::cout
#include <algorithm> // std::sort
#include <vector> // std::vector
bool myfunction (int i,int j) { return (i<j); }
struct myclass {
bool operator() (int i,int j) { return (i<j);}
} myobject;
int main () {
int myints[] = {32,71,12,45,26,80,53,33};
std::vector<int> testfan (myints+1, myints+5);
for (std::vector<int>::iterator it2=testfan.begin(); it2 != testfan.end(); it2++){
std::cout<< " " << *it2;
}
//71 12 45 26
std::cout<< "dfsfsfs " ;
std::vector<int> tes (testfan.begin()+1, testfan.end()-2);
for (std::vector<int>::iterator it2=tes.begin(); it2 != tes.end(); it2++){
std::cout<< " " << *it2;
}
// 12
std::vector<int> myvector (myints, myints+8); // 32 71 12 45 26 80 53 33
// using default comparison (operator <):
std::sort (myvector.begin(), myvector.begin()+4); //(12 32 45 71)26 80 53 33
// using function as comp
std::sort (myvector.begin()+4, myvector.end(), myfunction); // 12 32 45 71(26 33 53 80)
// using object as comp
std::sort (myvector.begin(), myvector.end(), myobject); //(12 26 32 33 45 53 71 80)
// print out content:
std::cout << "myvector contains:";
for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
std::cout << ' ' << *it;
std::cout << '\n';
//myvector contains: 12 26 32 33 45 53 71 80
return 0;
}