写点什么

ARTS-week4

用户头像
王钰淇
关注
发布于: 2020 年 06 月 22 日
ARTS-week4

Algorithm

  • 题目:22. 括号生成

  • 描述:数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

  • 示例:


  • 题解:

class Solution {public:    vector<string> generateParenthesis(int n) {        vector<string> res;        dfs(n, "", 0, 0, res);        return res;    }    void dfs(int n, string path, int nl, int nr, vector<string>& res){        if(nl>n || nr>n || nr>nl)            return;        if(nl==nr && nl == n)        {            res.push_back(path);            return;        }        dfs(n, path+"(", nl+1, nr, res);        dfs(n, path+")", nl,nr+1,res);    }};
复制代码



Review

文章:Chrome: 70% of all security bugs are memory safety issues

链接:https://www.zdnet.com/article/chrome-70-of-all-security-bugs-are-memory-safety-issues/

内容介绍:Chrome 代码库中大约 70%的严重安全漏洞是内存管理和安全漏洞,其中有一半是释放后使用漏洞,即源于内存指针(地址)不正确的管理,为攻击者打开了攻击 Chrome 内部组件的大门。该数字与 Microsoft 共享的统计信息相同,在 2019 年 2 月的安全会议上,微软工程师表示,在过去的 12 年中,微软产品的所有安全更新中约 70%解决了内存安全漏洞。这些早期的编码错误导致在应用程序中引入内存管理漏洞。 这些漏洞包括释放后使用,缓冲区溢出,竞争条件,双重释放,野指针等。这些内存管理漏洞是攻击者试图查找和利用的最抢手的错误,因为它们可以授予他们将代码植入设备内存中并由受害者应用程序执行的能力。内存管理错误的问题在 Google 一直是个大问题,以至于 Chrome 工程师现在必须遵循“ Rule of Two”。

今天,Rust 被认为是最安全的编程语言之一,是 C 和 C ++的理想替代品,主要是由于 Mozilla 的早期努力。最后但并非最不重要的一点,谷歌还表示,它计划在可能的情况下使用“安全”语言进行探索,候选语言包括 Rust,Swift,JavaScript,Kotlin 和 Java。


Tips

  • 标题:C++模板坑

  • 内容:

  1. 问题描述:当在.h 中声明了模板,.cpp 中定义了模板,当 main 函数去进行模板实例化的时候,在声明处找不到对应的 T 类型,自然就出问题了。

  2. 解决方案:

第一种方式:同一文件,声明及定义都在.h 文件中。

// temp.h#ifndef _TEMP_H_#define _TEMP_H_#include <iostream>#include <vector>template <typename T>using Vec = std::vector<T>;#define PRINTFMT(x) std::cout << x << " ";
template <typename T>void TestTemp(const Vec<T> &v, T target){ [=]() { for (auto elem : v) if (elem == target) PRINTFMT(elem); }();}#endif
复制代码

第二种方式:分离开+引入头文件,采用头文件声明,cpp 定义,要想起作用,得在使用处引入两者并且定义处得用特化版本。

// Temp.cpp#include "temp.h"
void TestTemp(const Vec<int> &v, int target){ [=]() { for (auto elem : v) if (elem == target) PRINTFMT(elem); }();}
template <typename T>void TestTemp(const Vec<T> &v, T target){ [=]() { for (auto elem : v) if (elem == target) PRINTFMT(elem); }();}
复制代码

使用:

#include "temp.h"#include "temp.cpp"
int main() { std::vector<int> v{1,2,3}; int target = 2; TestTemp<int>(v,target);
return 0;}
复制代码

第三种方式:在末尾引入 cpp,只需要在.h 头文件末尾引入 cpp 即可。

// temp.h#ifndef _TEMP_H_#define _TEMP_H_#include <iostream>#include <vector>template <typename T>using Vec = std::vector<T>;#define PRINTFMT(x) std::cout << x << " ";
template <typename T>void TestTemp(const Vec<T> &v, T target);#include "temp.cpp"#endif
复制代码


// Temp.cpp#include "temp.h"
template <typename T>void TestTemp(const Vec<T> &v, T target){ [=]() { for (auto elem : v) if (elem == target) PRINTFMT(elem); }();}
复制代码


使用:

#include "temp.h"
int main() { std::vector<int> v{1,2,3}; int target = 2; TestTemp<int>(v,target);
return 0;}
复制代码


总结:可以简单的把模板理解为一种特殊的宏,模板类不要当作类,在被实例化的时候一定得找到定义,不然只看到声明,就 GG 了。


Share

文章提出的正交设计推荐的四种策略深得我心,总结来讲,变化导致的修改有两类:

  • 一个变化导致多处修改(重复);

  • 多个变化导致一处修改(多个变化方向);

由此得到前两个策略:消除重复分离不同变化方向

除此之外,我们要努力消除变化发生时不必要的修改,也有两种方式:

  • 不依赖不必要的依赖;

  • 不依赖不稳定的依赖;

这就是后面两个策略:缩小依赖范围向着稳定的方向依赖


发布于: 2020 年 06 月 22 日阅读数: 38
用户头像

王钰淇

关注

少花时间在说服别人的事上 2018.03.04 加入

跋涉中的C++程序员

评论

发布
暂无评论
ARTS-week4