Jian's Note

It's better to burn out than fade away!

Effective STL [34] | 注意哪个算法需要有序区间

不是所有算法可以用于任意区间。比如,remove需要前向迭代器和可以通过这些迭代器赋值的能力。所以,它不能应用于由输入迭代器划分的区间,也不能是map或multimap,也不能是set和multiset的一些实现。 同样,很多排序算法需要随机访问迭代器,所以不可能在一个list的元素上调用这些算法。 最

Effective STL [33] | 提防在指针的容器上使用类似remove的算法

删除含有指针的容器元素 如果你在管理一堆动态分配的Widgets,每一个都可能通过检验,你把结果指针保存在一个vector中: 1 2 3 4 5 6 7 8 9 10 11 12 class Widget{ public: ... // 这个Widget是否通过检验 bool isCertified() const; ... }; // 建立一个vector然后用动态分配的Widget的指针填充 vector<Widget*> v; ... v.push_back(new Widget); 当和v工作一段时间后,你决定除去未

Effective STL [32] | 如果你真的想删除东西的话就在类似remove的算法后接上erase

remove实际作用 remove的声明 1 2 template<class ForwardIterator, class T> ForwardIterator remove(ForwardIterator first, ForwardIterator last, const T& value); remove接收指定它操作的元素区间的一对迭代器。它不接收一个容器,所以remove不知道它作用于哪个容器。 此外,remove也不可能发现容器,因为没有办法从一个迭代器获取对应于它的容器。 remove不做什么 从容器中除去一个元素,唯一

Effective STL [31] | 了解你的排序选择

稳定排序 VS 不稳定排序 有些排序算法是稳定的。在稳定排序中,如果一个区间中的两个元素有等价的值,它们的相对位置在排序后不改变。不稳定的算法没做这个保证。 例如,在(未排序的)widgets vector中Widget A在Widget B之前,而且两者都有相同的质量等级,那么稳定排序算法会保证在这个vector

Transformer Q & A

1. 2017年深度学习领域的重大突破是什么? Transformer。有两方面的原因: 1.1 一方面,Transformer是深度学习领域继MLP、RNN、CNN之后的第4大特征提取器(也被称为基础模型)。 什么是特征提取器? 特征提取器是计算机模仿大脑,与外部世界(图像、文字、语音等)交互的方式,如图1所示。举

Transformer | 如何理解attention中的Q,K,V?

解答一 我们直接用torch实现一个SelfAttention来说一说: 首先定义三个线性变换矩阵,query, key, value: 1 2 3 4 class BertSelfAttention(nn.Module): self.query = nn.Linear(config.hidden_size, self.all_head_size) # 输入768, 输出768 self.key = nn.Linear(config.hidden_size, self.all_head_size) # 输入768, 输出768 self.value = nn.Linear(config.hidden_size, self.all_head_size) 注意,这里的query, key, value只是一种操作(线性变换)的名称,实际的Q/K/V是它们三个

Effective STL [30] | 确保目标区间足够大

STL容器在被添加时(通过insert、push_front、push_back等)自动扩展它们自己来容纳新对象。 插入数据 尾部插入 back_inserter 当你想向容器中插入对象但并没有告诉STL他们所想的时,问题出现了: 1 2 3 4 5 6 7 8 9 10 int transmogrify(int x); // 自定义的这个函数从x产生一些新值 vector<int> values; ... // 把数据放入values vector<int> results; // 把tr

Effective STL [29] | 需要一个一个字符输入时考虑使用istreambuf_iterator

istream_iterator 拷贝文件 假设要把一个文本文件拷贝到一个字符串对象中。似乎可以用一种很有道理的方法完成: 1 2 3 4 ifstream inputFile("interestingData.txt"); string fileData((istream_iterator<char>(inputFile)), istream_iterator<char>()); // 把inputFile读入fileData; // 关于为什么它不是很正确请看下文关于这个语法的警告参见条款6 很快你就会发现这种方法无法把文件中的空格拷贝到字符串中。 那是因为istream_itera

Effective STL [28] | 了解如何通过reverse_iterator的base得到iterator

Example 通过reverse_iterator的base初始化一个iterator: 1 2 3 4 5 6 7 vector<int> v; v.reserve(5); // 参见条款14 for(int i = 0;i < 5; ++ i) { // 向vector插入1到5 v.push_back(i); } vector<int>::reverse_iterator ri = find(v.rbegin(), v.rend(), 3); // 使ri指向3 vector<int>::iterator i(ri.base()); // 使i和ri的base一样 执行上述代码后,可以想到产生的结果就像这样: 上图显示了reverse_iterat
0%