一维vector 的创建和初始化
- 常见用法
vector<int> vec1; // 是空的整形vector,我们没有给他添加任何元素。
vector<float> vec2(3); //初始化了一个有3个元素的vector,由于并没有指定初始 值,将会使用编译器默认的初始值。
vector<char> vec3(3,'a'); //初始化了含有3个a的字符vector
vector<char> vec4(vec3); //通过拷贝vec3中的元素初始化vec4,它们的元素会一模一样。
std::vector<std::vector<int>> a2 = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };
- 扩容初始化
producePerid.resize(perids.size(), 0); // 扩容初始化
vector的添加
vec1.push_back(1);
v.insert(v.begin(), 10); //插入一个元素
v.insert(v.begin(), 3, 10); //在开始插入10,10,10
vector的遍历
//利用下标
for (vector<int>::size_type ix = 0; ix != v.size(); ix ++){
printf("%d\t", v[ix]);
}
printf("\n");
//利用迭代器
vector<int>::iterator it;
for (it = v.begin(); it != v.end(); it ++){
printf("%d\t", *it);
}
vector的删除
vector 删除元素的几种方法
- 1、利用成员函数pop_back()可以删除最后一个元素;
- 2、利用成员函数erase()
遍历删除全部元素
vector `<int>`::iterator it;
for (it = vecnum.begin(); it != vecnum.end(); )
{
//注意使用erase()方法时,迭代不要随意的++
it = vecnum.erase(it); // 注意这里一定要将it设为返回值
}
删除特定元素
vector `<int>`::iterator it;
for (it = vecnum.begin(); it != vecnum.end(); )
{
//注意使用erase()方法时,迭代不要随意的++
if(*it == 1) {
it = vecnum.erase(it); // 注意这里一定要将it设为返回值
} else {
it++;
}
}
erase()可以删除由一个iterator指出的元素;返回的迭代器指向被删除元素后的位置,
erase在每次操作时,迭代器指针会整体前移1,`auto iter = data.erase(std::begin(data)+1,std::begin(data)+3);`
它的返回值是 std::begin(data)+1 其实也就是原删除前的 std::begin(data)+4 ;
如果删除了最后一个元素,它就是 std::end(data)。
[erase在每次操作时,迭代器指针会整体前移1,就是每次都会移动全部数据](https://so.csdn.net/so/search?q=vector&spm=1001.2101.3001.7020),
所以不适合做频繁删除的容器
-
3、通过STL中的算法库函数remove()删除指定的元素,
remove() 算法由定义在 algorithm 头文件中的模板生成,它可以删除匹配特定值的一段元素。例如auto iter = std::remove(std::begin(words), std::end(words), "none"); 表示删除,words中的none字符串,并将后面的字符前移填满整个字符串,最后返回指向字符串末尾的迭代器,注意这里的末尾不是字符串真正的末尾,是压缩之后的字符串的末尾。http://c.biancheng.net/view/429.html
-
4、swap,清空了容器,且释放了内存。 示例:vector().swap(vecnum);
-
5、clear(),清空元素,但不回收空间
-
6、resize可以重新定义实际数据量size,但不会改变容量 capacity,具体参看 resize的的不同,因此swap也可以用来清空数组,具体参看 resize的的不同,因此swap也可以用来清空数组,具体参看
判断是否相等
if (vec1 == vec2)
排序
1、默认升序
sort(num.begin(),num.end()); // 需要包含头文件** **# **include** `<algorithm>`**
sort(name.rbegin(),name.rend()); // 同理 简单降序排序
2 lambda函数
写法1:匿名函数
vector<int>vec{5,4,6,9,8,1};
std::sort(s.begin(), s.end(), [](int a, int b) {
return a > b;
});
写法2:lamda函数
记忆点:bool返回 + 引用& + 参数的类型是元素
vector<vector<int> >a(6);
bool cmp(vector<int>&a,vector<int>&b){
if(a[0]!=b[0]) return a[0]<b[0];
else return a[1]>b[1];
}
sort(num.begin(),num.end(), cmp)
2、操作符重载进行排序
注意这里只有一个入参,因为操作符是内置函数,其次这里是类的成员函数,再其次这里是操作符+括号的形式
记忆点:返回bool + 函数名为 Student::operator> + 单const 对象&参数
bool Student::operator>(const Student& stu)
{
if(this->age > stu.age)
return true;
return false;
}
3、函数对象进行排序
深浅拷贝
-
浅拷贝:
vector &nums2 = nums; 这是一个浅拷贝 ,类似为 nums取了一个别名 -
深拷贝的方法如下:
一、初始化构造时拷贝 或 赋值运算符 --深复制 创建了一个新对象,影分身
vectortem(list); //这种拷贝,相当于复制了一份数据,list中的数据不变。
vector &nums2 = nums; 这是一个浅拷贝 有取地址符号
nums2 = nums; // 这是一个深拷贝二、assign。换汤不换碗
temlist.assign(list.begin(), list.end()); 复制了一份数据,list中的数据不变
outArray.assign(5, 0);//5个0,清空原数据={0,0,0,0,0,}三、swap 数据和空间完全互换 – 深复制,原数据变了 交换角色和空间
vector<int>
temlist;
temlist.swap(list);
将list中数据全部移到temlist中,此时list中为空了四、insert
temlist.insert(temlist.end(), temlist2.begin(), temlist2.end());
将temlist2中的数据,全部插入到temlist的末尾。相当于复制了一份数据。
多维向量的创建和初始化
多维向量初始化:
记忆点:
左边的不变 + 然后就是是()的递归展开 + 变量名只有一个
三级定义 变量名(num1, 二级定义(num, 一级定义(num, val)))
vector<int> array(n);
vector<vector<int>> array(m, vector<int>(n));//定义m行n列二维数组,如 vector<vector<int>> test(4,vector<int>(20));
vector<vector<int>> vec(m, vector<int>(n, 0)); // 二维数组的初始化
vector<vector<vector<int>>> vec(n1, vector<vector<int>>(n2, vector<int>(n3, 0))); // 三维数组的初始化