关于快读

Posted 海岸线绿藻疯长

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于快读相关的知识,希望对你有一定的参考价值。

不会真的有人这么写吧

关于快读

我们在关于卡常里提到了快读,这里是一些方便(闲得慌)的写法

\\(case\\space 1\\)

有时候要读多种类型,可以用 \\(template\\),这样只用写一个快读

template<typename T>
il void rd(T &x)
    x=0;ri bool f=0;ri char c=getchar();
    while(~c&&!isdigit(c)) f|=(c==45),c=getchar();
    while(isdigit(c)) x=x*10+(c^48),c=getchar();
    x=f?-x:x;
    
template<typename T>
il void wt(T x)
    if(x<0) x=-x,putchar(45);
    if(x>=10) wt(x/10);
    return putchar(x%10|48),void();

\\(case\\space 2\\)

一些没用的偷懒……可以一次读多个

template<typename T>
il void rd(T &x)
    x=0;ri bool f=0;ri char c=getchar();
    while(~c&&!isdigit(c)) f|=(c==45),c=getchar();
    while(isdigit(c)) x=x*10+(c^48),c=getchar();
    x=f?-x:x;
    
template<typename T,typename ...Args>
il void rd(T &a,Args &...args)rd(a),rd(args...);
template<typename T>
il void wt(T x)
    if(x<0) x=-x,putchar(45);
    if(x>=10) wt(x/10);
    return putchar(x%10|48),void();

template<typename T,typename ...Args>
il void wt(T a,Args &...args)wt(a),putchar(10),wt(args...);  

edit

使用 GRDB 在 Swift 中操作 SQLite 数据库 | 快读

关于 GRDB

说到 iOS 中使用 SQLite,如果你有过 Objective-C 开发经验的话,那么你肯定会想到 FMDB。在 Objective-C 生态中,这个库的使用非常广泛。不光是 FMDB,就单说 SQLIte 本身,也已经基本成为移动端的数据存储标配。假如你要在移动端存储一些本地数据,一旦数据结构稍微复杂起来,SQLite 就是最好的选择。无论是在 iOS 还是 Android 平台上,它的使用率都很高。

这次聊的 GRDB 就是针对 Swift 开发者的 SQLite 操作工具库。多啰嗦一句,为什么要有诸如 FMDB 或是 GRDB 这样的第三方组件呢,最主要的原因之一就是 SQLite 原生的 API 相对更偏底层,作为应用开发者更需要的是一个能高效实用的 API 接口,这也是这些第三方组件主要所提供的价值了。

开始使用

首先我们需要安装 GRDB,简单的方式是通过 CocoaPods:

use_frameworks! pod 'GRDB.swift'

当然,你也可以通过其他包管理,比如 Carthage 或者完全手动安装。 这里我们不多赘述,稍后我把 GRDB 的 Github 主页发出来,里面有完整的介绍。

安装完成之后,就可以使用它的 API 接口了:

import GRDB
// Pick one:
let dbQueue = try DatabaseQueue(path: "/path/to/database.sqlite")
let dbPool = try DatabasePool(path: "/path/to/database.sqlite")

有两种方式建立数据库连接, DatabaseQueue 和 DatabasePool。两种方式各有优劣,DatabaseQueue 不支持并发操作,但可以创建内存级别的数据库。 DatabasePool 对并发操作有内建的支持,但它会使用一种叫做 WAL 的模式操作数据库,也会带来一些弊端。

所以官方建议,如果你没有明确的目标,那么默认选择 DatabaseQueue 模式。

另外,关于 WAL 模式的详细内容可以参考 SQLite 官网的介绍 https://www.sqlite.org/wal.html

创建好数据库连接之后,我们就可以进行 SQL 操作了,比如建表和插入数据:

try dbQueue.inDatabase { db in    
 try db.execute(        
   "CREATE TABLE persons (" +
   "id INTEGER PRIMARY KEY," +
   "name TEXT NOT NULL," +
   "age INT" +
 ")")    
 try db.execute(        
   "INSERT INTO persons (name, age) VALUES (:name, :age)",
   arguments: ["name": "Barbara", "age": 39])  // Join multiple statements with a semicolon:  
 try db.execute(
   "INSERT INTO persons (name, age) VALUES (?, ?); " +
   "INSERT INTO persons (name, age) VALUES (?, ?)",        
   arguments: ["Arthur", 36, "Barbara", 39]) }

查询数据:

try dbQueue.inDatabase { db in  if let row = try Row.fetchOne(db, "SELECT * FROM wines WHERE id = ?", arguments: [1]) {        
   let name: String = row.value(named: "name")        
   let color: Color = row.value(named: "color")        
   print(name, color)  } }

查询数据使用的是 Row.fetchOne 方法,这个方法可以查询一条记录。

当然除了直接使用 SQL 这种形式外, GRDB 还给我们提供了一组称为 Query Inerface 的方法:

try dbQueue.inDatabase { db in  try db.create(table: "pointOfInterests") { t in    t.column("id", .integer).primaryKey()    t.column("title", .text).notNull()    t.column("favorite", .boolean).notNull().defaults(to: false)    t.column("longitude", .double).notNull()    t.column("latitude", .double).notNull()  }    

 // PointOfInterest?  
 let paris = try PointOfInterest.fetchOne(db, key: 1)    

 // PointOfInterest?
 let titleColumn = Column("title")    
 let berlin = try PointOfInterest.filter(titleColumn == "Berlin").fetchOne(db)    

 // [PointOfInterest]
 let favoriteColumn = Column("favorite")    
 let favoritePois = try PointOfInterest    .filter(favoriteColumn)    .order(titleColumn)    .fetchAll(db) }


结束

这次把 GRDB 给大家做了一个简要的介绍。GRDB 算的上是 Swift 社区中比较成熟的 SQLite 开源库,支持多个 Swift 版本,并且 API 接口使用起来也比较简洁,如果你的项目中有类似需要的话,GRDB 会是一个不错的选择。

当然这里给大家列出的只是它的九牛一毛,完整的文档大家还可以到它的 Github 主页上面继续了解 https://github.com/groue/GRDB.swift


以上是关于关于快读的主要内容,如果未能解决你的问题,请参考以下文章

[模板] 有理数取余

快读与快写的实现

快读]目录页

快读]目录页

快读]目录页

[模板]快读