目录
(3)vector开空间用reserve还是resize?——用reserve
(4)string vector等都有一个特点,删除数据,一般是不会主动缩容
(4)vector中没有find函数,要用算法中的find函数
定义:可以动态增长的数组
size_type 就是被typedef的size_t
- #include
- #include
- using namespace std;
-
- void test_vector1()
- {
- vector<int> v1;
- v1.push_back(1);
- v1.push_back(2);
- v1.push_back(3);
- v1.push_back(4);
-
- vector<double> v2;
- v2.push_back(1.1);
- v2.push_back(2.2);
- v2.push_back(3.3);
-
- vector
v3; - v3.push_back("李白"); //单参数的构造函数支持隐式类型转换:
- v3.push_back("杜甫"); //string s="hello world";先构造再拷贝构造
- v3.push_back("苏轼");
- v3.push_back("白居易");
-
- vector<int> v4(10, 5);
-
- vector
v5(++v3.begin(), --v3.end()) ; //迭代器,此处是"杜甫","苏轼" - string s = "hello world";
-
- vector<char> v6(s.begin(), s.end());
- }
与string遍历大致相同
- void test_vector2()
- {
- // 遍历
- vector<int> v;
- v.push_back(1);
- v.push_back(2);
- v.push_back(3);
- v.push_back(4);
-
- // 1、下表+[]
- for (size_t i = 0; i < v.size(); ++i)
- {
- v[i] += 1;
- cout << v[i] << " ";
- }
- cout << endl;
-
- // 2.迭代器
- vector<int>::iterator it = v.begin();
- while (it != v.end())
- {
- *it -= 1;
- cout << *it << " ";
- ++it;
- }
- cout << endl;
-
- // 3.范围for
- for (auto e : v)
- {
- cout << e << " ";
- }
- cout << endl;
- }
vs下面-- PJ版本——1. 5倍增容
linux g++ SGI版本——2倍增容

即为什么vs下扩容按1.5倍扩容,linux的g++扩容按2倍扩容?
单次增容越多,插入N个值,增容次数越少,效率就越高,但是浪费空间就越多;
单次增容越少,浪费空间就少了,但是会导致频繁增容,效率低下。
因此不一定是1.5倍或者2倍,也可能是3,4倍,只是1.5或2倍是一个比较平衡的值。
如果知道要开多大空间,就用reserve提前开好。
如果用resize就是开空间并初始化,比如foo.resize(100); 开100个int空间,全部初始化成0,如果再foo.push_back(i); 就是在这100个空间以后再加数据,因为前100个已经有数据了
- void test_vector3()
- {
- //vector
v; - //cout << v.max_size() << endl;
- size_t sz;
- std::vector<int> foo;
- foo.reserve(100); //如果知道要开多大空间,就用reserve提前开好
- //foo.resize(100);
- sz = foo.capacity();
- std::cout << "making foo grow:\n";
- for (int i = 0; i < 100; ++i) {
- foo.push_back(i);
- if (sz != foo.capacity()) {
- sz = foo.capacity();
- std::cout << "capacity changed: " << sz << '\n';
- }
- }
-
- }
若非要缩容,那就用函数 shrink_to_fit() ,但是要慎用,少用,表面是缩容_capacity——>_size,实际它的底层是开辟一块_size的空间,并把内容拷贝过来,实际上是用时间换空间了,但是我们一般是不差空间的,而且通常是用空间换时间,所以说不建议时间换空间的做法,即:少用 shrink_to_fit() 函数。
- void test_vector3()
- {
- //vector
v; - //cout << v.max_size() << endl;
- size_t sz;
- std::vector<int> foo;
- foo.reserve(100);
- //foo.resize(100);
- sz = foo.capacity();
- std::cout << "making foo grow:\n";
- for (int i = 0; i < 100; ++i) {
- foo.push_back(i);
- if (sz != foo.capacity()) {
- sz = foo.capacity();
- std::cout << "capacity changed: " << sz << '\n';
- }
- }
-
- //vector
countV; - //countV.resize(100, 1);
- //countV.resize(10);
-
- // string vector等都有一个特点,删除数据,一般是不会主动缩容
- foo.resize(10);
- cout << foo.size() << endl;
- cout << foo.capacity() << endl;
-
- // 慎用、少用
- foo.shrink_to_fit();
- cout << foo.size() << endl;
- cout << foo.capacity() << endl;
- }
他们都是不支持下标增加或删除的,都是用的迭代器
返回值是iterator是为了解决迭代器失效,这个后面再详细说。


- void test_vector4()
- {
- // 遍历
- vector<int> v;
- v.push_back(1);
- v.push_back(2);
- v.push_back(3);
- v.push_back(4);
-
- v.insert(v.begin(), -1);
- v.insert(v.begin(), -2);
- v.insert(v.begin(), -3);
-
- for (auto e : v)
- {
- cout << e << " ";
- }
- cout << endl;
-
- v.insert(v.begin()+7, 300);
- //v.insert(v.begin()+8, 300);
-
- for (auto e : v)
- {
- cout << e << " ";
- }
- cout << endl;
- v.erase(v.begin());
- v.erase(v.begin());
-
- for (auto e : v)
- {
- cout << e << " ";
- }
- cout << endl;
- }
交换两个vector类对象指向的空间,例如:v1.swap(v2);

清掉全部数据

algorithm——算法 #include

- void test_vector5()
- {
- // 遍历
- vector<int> v;
- v.push_back(1);
- v.push_back(2);
- v.push_back(3);
- v.push_back(4);
-
- //vector
::iterator pos = find(v.begin(), v.end(), 3); - auto pos = find(v.begin(), v.end(), 3); //类型太长可以用auto
- if (pos != v.end())
- {
- cout << "找到了" << endl;
- v.erase(pos);
- }
- else
- {
- cout << "没有找到" << endl;
- }
-
- for (auto e : v)
- {
- cout << e << " ";
- }
- cout << endl;
- }
#include

sort默认是升序
- void test_vector5()
- {
- // 遍历
- vector<int> v;
- v.push_back(1);
- v.push_back(2);
- v.push_back(4);
-
- v.push_back(0);
- v.push_back(9);
- v.push_back(3);
- v.push_back(1);
-
- // 默认是升序
- sort(v.begin(), v.end()); // <
-
- for (auto e : v)
- {
- cout << e << " ";
- }
- cout << endl;
- }

排降序,仿函数
关于仿函数,大家先记住这个用法,具体我们后面讲队列再详细讲
- void test_vector5()
- {
- // 遍历
- vector<int> v;
- v.push_back(1);
- v.push_back(2);
- v.push_back(4);
-
- v.push_back(0);
- v.push_back(9);
- v.push_back(3);
- v.push_back(1);
-
- // 默认是升序
- //sort(v.begin(), v.end()); // <
-
- // 排降序,仿函数
- // 关于仿函数,大家先记住这个用法,具体我们后面讲队列再详细讲
- // sort(v.begin(), v.end(), greater
()); // > -
- greater<int> g;
- sort(v.begin(), v.end(), g); // >
-
-
- for (auto e : v)
- {
- cout << e << " ";
- }
- cout << endl;
- }

5.题目:杨辉三角
给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。

示例 1:
输入: numRows = 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]
示例 2:
输入: numRows = 1 输出: [[1]]
解法:
