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 日 阅读数: 28
用户头像

王钰淇

关注

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

跋涉中的C++程序员

评论

发布
暂无评论
ARTS-week4