C语言题解
int** generate(int numRows, int* returnSize, int** returnColumnSizes) { int** ret = malloc(sizeof(int*) * numRows); // 指针数组 *returnSize = numRows; // 指针数组元素的个数 *returnColumnSizes = malloc(sizeof(int) * numRows); // returnColumnSizes为一级指针的地址 for (int i = 0; i < numRows; ++i) { ret[i] = malloc(sizeof(int) * (i + 1)); // 让指针数组里的指针都指向一块空间 (*returnColumnSizes)[i] = i + 1; // 每一行元素的个数 ret[i][0] = ret[i][i] = 1; for (int j = 1; j < i; ++j) { ret[i][j] = ret[i - 1][j] + ret[i - 1][j - 1]; } } return ret; }
C++题解
class Solution { public: vector<vector<int>> generate(int numRows) { vector<vector<int>> vv; vv.resize(numRows); for(size_t i = 0; i < vv.size(); i++) { // vv[i]的类型为vector<int> vv[i].resize(i + 1); // 开辟空间 vv[i][0] = vv[i][vv[i].size()-1] = 1; } for(size_t i = 0; i < vv.size(); i++) { for(size_t j = 1; j < i; j++) { vv[i][j] = vv[i-1][j-1] + vv[i-1][j]; } } return vv; } };
👉vector 的增删查改👈
operator[ ]和 at 的相同和区别
at() 函数和 [] 运算符的重载,两者都可以得到相应下标的值,并且两者都会去做边界检查。当发生越界行为时,at 是抛异常,operator[] 是报出 assert 错误。assert 断言在 Release 版本下会被优化掉,不会起作用。
补获异常
函数接口什么时候用 const 修饰,什么时候不需要用 const 修饰。
assign
void vectorTest4() { vector<int> v; v.push_back(1); v.push_back(2); v.push_back(3); v.push_back(4); for (auto e : v) { cout << e << ' '; } cout << endl; v.assign(10, 1); for (auto e : v) { cout << e << ' '; } cout << endl; string s("hello world"); v.assign(s.begin(), s.end()); for (auto e : v) { cout << e << ' '; } cout << endl; }
注:assign的迭代器赋值,迭代器可以是任意类型的迭代器。
insert
注:string 和 vector 可以用迭代器 + 数字的玩法,而 list 没有。因为 string 和 vector 的空间是连续的,而 list 的空间是不连续的。string 和 vector 的正向迭代器为指针,而 list 的迭代器不是指针。
find
注:find 函数是算法库里的函数,并不是 vector 的成员函数(因为每个容器有 find 函数,且功能都一样,所以就就设计成库函数了),使用时需要包algorithm头文件。
那为什么 string 类不直接复用算法库的find函数,要自己设计呢?因为 string 类可能要查找一个子串。
swap
注:vector 有专门的模板交换函数,只要是避免使用std::swap这个函数,因为这个函数要3次深拷贝。
注:编译器会调用更加匹配的函数接口。
👉总结👈
以上就是 vector 的介绍和常见接口的使用,下一篇博客将会给大家讲解 vector 的模拟实现。那么以上就是本篇博客的全部内容了,如果大家觉得有收获的话,可以点个三连支持一下!谢谢大家!💖💝❣️