个人主页~
vector(上)~
vector(下)–上篇~
vector
二、模拟实现3、test.cpptest1test2test3test4test5test6 三、一个难题
二、模拟实现
3、test.cpp
test1
这个没啥好说的,就是尾插和迭代器都能正常使用
//测尾插和迭代器void test1(){vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);v.push_back(5);for (size_t i = 0; i < v.size(); i++){std::cout << v[i] << " ";}std::cout << std::endl;vector<int>::iterator it = v.begin();while (it != v.end()){*it *= 10;std::cout << *it << " ";++it;}std::cout << std::endl;for (auto e : v){std::cout << e << " ";}std::cout << std::endl;}
test2
这个测试有两部分,第一部分就是被注释掉的这一部分,第二部分就是剩下的部分
void test2(){/*int i = 0;int j(1);int k = int(2);*/vector<int*> v1;v1.resize(5);vector<std::string> v2;//v2.resize(10, string("xxx"));//匿名对象v2.resize(10, "xxx");//隐式类型转换for (auto e : v1){std::cout << e << " ";}std::cout << std::endl;for (auto e : v2){std::cout << e << " ";}std::cout << std::endl;}
关于第一部分,这段代码都是内置类型,它们也与类模板的初始化方式相同,这是因为T可以是任意的类型,当然也可以是int、double等内置类型,所以这里的构造遵从类模板
第二部分就是resize的测试,这里v1的类型是vector<int*>也就是相当于是指针数组
test3
测试insert
void test3(){vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);v.push_back(5);for (auto e : v){std::cout << e << " ";}std::cout << std::endl;vector<int>::iterator it = v.begin() + 2;v.insert(it, 30);for (auto e : v){std::cout << e << " ";}std::cout << std::endl;//v.insert(v.begin(), 30);//这是头插v.insert(v.begin() + 3, 30);for (auto e : v){std::cout << e << " ";}std::cout << std::endl;}
这里可以清楚地看到迭代器的加上一个数的效果以及insert效果的实现
test4
测试erase
void test4(){vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);v.push_back(5);for (auto e : v){std::cout << e << " ";}std::cout << std::endl;auto pos = v.begin();v.erase(pos);for (auto e : v){std::cout << e << " ";}std::cout << std::endl;v.erase(v.begin() + 3);for (auto e : v){std::cout << e << " ";}std::cout << std::endl;}
这也没啥好说的,就是erase的效果实现
test5
测试拷贝构造函数
void test5(){vector<int> v1;v1.push_back(1);v1.push_back(1);v1.push_back(1);v1.push_back(1);v1.push_back(1);vector<int> v2(v1);for (auto e : v1){std::cout << e << " ";}std::cout << std::endl;for (auto e : v2){std::cout << e << " ";}std::cout << std::endl;vector<int> v3;v3.push_back(10);v3.push_back(20);v3.push_back(30);v3.push_back(40);v1 = v3;for (auto e : v1){std::cout << e << " ";}std::cout << std::endl;}
test6
reverse和resize
void test6(){vector<int> v1;v1.reserve(10);v1.resize(20, 0);v1.resize(10, 1);}
我们可以通过调试来观察这两个成员函数的行为
此时start和finish相同,endofstorage减去start换算为十进制就是40,也就刚好是10个int,满足reserve的功能,size没有动,只改变了capacity
此时resize改变了size以及capacity,finish与endofstorage相同,同时我们可以看到这里扩容后地址改变了,也就是说这些指针指向新空间了,同时start位置的值已经成为0,当然start到finish的所有值都是0
这里可以观察到,finish的位置在start10个int之后,endofstorage的位置在finish的10个int之后,因为操作之前的finish大于start+n(n为resize第一个参数),所以不改变之前的内容
三、一个难题
电话号码的字母组合
我们先把答案写出来然后慢慢梳理
class Solution { const char* numStrArr[10] = {"","","abc","def","ghi","mno","pqrs","tuv","wxyz"}; //0~9每个数字所对应的字符串public: void Combine(const string& digits,int i,string combineStr,vector<string>& ret) { if(i == digits.size()) { ret.push_back(combineStr); return; } int num = digits[i] - '0'; string str = numStrArr[num]; for(auto ch: str) { Combine(digits,i+1,combineStr+ch,ret); } } vector<string> letterCombinations(string digits) { vector<string> v; if(digits.empty()) { return v; } string str; Combine(digits,0,str,v); return v; }};
这里画了一个简易的过程图
首先这个函数是一个结合函数,用来组合各个字符,当递归的次数与所键入的数字数相等时,就尾插最后一个字符后返回
num用来记录当前函数处理的是哪个数字,str用来保存当前这个数字所对应的字符串,然后将它们一个一个取出来进行结合
第零层取出2,组合出空字符串,第一层取出5,组合的字符串就是2对应的“a”、“b”、“c”,第二层取出8,组合的字符串为“aj”、“ak”、“al”、“bj”、“bk”、“bl”、“cj”、“ck”、“cl”,第三层时与所键入的数字数相等了,尾插tuv三个字符
题目解析起来很容易看懂,但是自己来做的话很难做,这里就是一个vector与string的结合题目,属于前序遍历类的题目
今日分享结束~