Calvin's Marbles


  • 首页

  • 关于

  • 归档

  • 标签

  • 搜索

Leetcode4 Median of Two Sorted Arrays

发表于 2017-02-04

LeetCode第4题,求两个数组nums1和nums2的中位数,要求对数复杂度。这个思路很清晰,就是二分。一开始想的lower_bound比较一波,算一下偏移,然后两段去掉相同数目的元素,构成一个子问题。不过实现的时候被字符串常见的边界情况和上下中位数困住了,想了好久,后来发现其实自己想复杂了,这就是一个求第k个数的问题,直接二分答案就好了。

阅读全文 »

C++中编译器优化导致的一个问题

发表于 2017-01-27

今天在MSVC2015上在用for遍历std::vector<T>时遇到一个Access Violation错误,关键代码如下

1
2
3
4
for (auto i = v.size() - 1; i >= 0; i--)
{
// ...
}
阅读全文 »

Fortran数组的C++实现

发表于 2017-01-18

最近在写CFortranTranslator,一个从Fortran77/Fortran90到C++14的工具,其中涉及到使用C++为Fortran实现一个数组库。
总的来讲,Fortran90的有些语言特性在编写和编译上都让人不是很舒服。比如没有头文件和前置声明,这导致了许多额外的代码和解析工作,比如INTERFACE块因此而生(但其实也是一个比较好的解决方案,和前置声明也差不多)。又比如Fortran兼容老标准的问题,这个写C++的同学也应该深有同感,C++为了保持和C的linkage做了不少擦屁股的事情,像什么POD、函数指针/函数对象啥的。Fortran老标准中允许隐式声明变量,而且可以通过名字推断变量的类型,而且由于COMMON块的存在还要兼容一些奇妙的用法。这使得处理变量声明的工作要延迟到处理函数体时。Fortran90还可以直接根据Attribute specification statements给变量加属性(ISO/IEC 1539 : 1991 ch5.2),加上隐式声明的情况,实际上类似于INTENT、PARAMETER、DIMENSION这样的语句需要考虑是生成一段新变量声明还是修改老声明,这同样会延迟处理变量声明的工作,还会要求建立符号表。此外各种impied-do结构,虽然可以完全展开成for循环,但是为了保持Fortran源语句的抽象,最好还是做成一个表达式。还有Fortran77里面的nonblock DO construct非常恶心,从语法上完全无法解析了,最偷懒的办法就是先用start condition给flex开洞,再#define YYLEX给bison开洞。不过后来token级的continuation迫使我直接手写词法分析了,果然偷懒还是要不得的。
此外Fortran的传参机制也很特别,类似于宏的形式,基于引用,具体类型和限定要在函数体中才能看到。为了能够兼容语义,我全部使用了右值作为参数限定
关于C++元编程的部分可以参考C++模板编程这篇文章中,关于使用flex/bison进行语法分析的部分我放到了flex和bison使用,其他的部分放在这里。

阅读全文 »

C++中static关键字的用法

发表于 2017-01-02

C++中static关键字具有很多迥然不同的意义与用途,常在不同的情景下出现。例如声明局部静态变量、声明静态函数、声明类的静态成员。这三种用法的背后分别对应着不同的linkage。本文还将static与inline、extern等存储类指定符进行简单的比较,以期了解C++编译阶段和连接阶段的行为。

阅读全文 »

C++初始化方式

发表于 2016-12-30

C++新标准之后对初始化方式有了很多的变动,现在的初始化方式主要可以分为五种来讨论,分别是list initialization、aggregate initialization、zero initialization、default initialization、value initialization。本文根据标准以及cppreference上的相关资料论述了这五种初始化方式,并讨论了POD、成员初始化列表、new关键字等方面的问题。

下面是个总的例子

1
2
3
4
5
6
7
8
9
10
11
12
// Value initialization
std::string s{};
// Direct initialization
std::string s("hello");
// Copy initialization
std::string s = "hello";
// List initialization
std::string s{'a', 'b', 'c'};
// Aggregate initialization
char a[3] = {'a', 'b'};
// Reference initialization
char& c = a[0];
阅读全文 »

C++元编程

发表于 2016-12-22

元编程是C++的一个重点和难点,标准库中有非常多的内容都是通过模板实现的。

C++11标准以来,C++在泛型编程方面引入了许多新的特性。

阅读全文 »

ICPC CHINA-FINAL小记

发表于 2016-12-11

退役之战

阅读全文 »

NUAA-HHU联赛小记

发表于 2016-12-04

今天参加NUAA-HHU联赛,拿了1030分,第六,出了9条。

阅读全文 »

CCPC2016宁波总决赛小记

发表于 2016-11-28

CCPC2016宁波总决赛小结,唉dalao太多了,这场就是去膜的。

阅读全文 »

组合博弈

发表于 2016-11-23

总结一下网上教程关于组合博弈的部分要点

阅读全文 »
1…181920…25
Calvin Neo

Calvin Neo

243 日志
152 标签
RSS
GitHub Twitter Weibo
Links
  • xqq
  • wenwen
  • zyyyyy
© 2015 - 2025 Calvin Neo   Hosted by Coding Pages
版权声明
由 Hexo 强力驱动
主题 - NexT.Muse