Arrays, Vectors & Strings

Slides:



Advertisements
Similar presentations
口試準備及口語表達技巧 民國 98 年 2 月 26 日 12:00pm 國立三重高中 陸芳瑜老師 1.
Advertisements

我们会赞叹生命之花的绚丽和多姿,也会歌颂生命之树的烂漫和青翠,但是生命是如此脆弱……
Memory Pool ACM Yanqing Peng.
第4章 VHDL设计初步.
第11章 使用类.
程設一.
高级语言程序设计 C++程序设计教程(下) 2006年春季学期 与一些教材的区别 偏重理论,不去讨论某个系统的具体使用方法,但会涉及实现技术
第8章 字串與陣列 8-1 字串處理 8-2 一維陣列的處理 8-3 建立多維陣列 8-4 不規則陣列與參數傳遞 8-5 陣列排序與搜尋.
Using C++ The Weird Way Something about c++11 & OOP tricks
C# 程式設計 第一部分 第1-4章 C# 程式設計 - 南華大學資管系.
Chapter 7 Search.
關聯式資料庫.
走向C++之路 WindyWinter WindyWinter感谢诸位前来捧场。
Chapter 4 歸納(Induction)與遞迴(Recursion)
struct 可以在同一個名稱下擁有多種資料型態。使用struct能讓資料的存取和處理更為靈活。
Derived Class 前言 衍生類別的定義 單一繼承 public, protected, 和 privated 基底類別
程序设计II 第三讲 字符串处理.
Last Lecture Revisited
Matlab M檔案 方煒 台大生機系.
·线性表的定义及ADT ·线性表的顺序存储结构 ·线性表的链接存储结构 · 单向循环链表 · 双链表、双向循环链表 · 一元多项式的加法
第六章 继承性和派生类 胡昊 南京大学计算机系软件所.
数据结构 第4章 串.
第三章 C++中的C 面向对象程序设计(C++).
The expression and applications of topology on spatial data
Lecture 1 STL Primer.
【STL標準樣版函式庫】 STL(Standard Template Library),即標準樣版函式庫,是一個具有工業標準、高效率的C++函式庫。它包含於C++標準函式庫(C++ Standard Library)中,是ANSI/ISO C++標準中,最新的、也是極具革命性的一部分。STL包含了諸多在電腦科學領域裏所常用的基本資料結構和基本演算法。為廣大C++程式師們提供了一個可擴展的應用框架,高度實現了軟體的可複用性。這種現象有些類似於Microsoft.
第3章 變數、常數與資料型態 3-1 C語言的識別字 3-2 變數的宣告與初值 3-3 指定敘述 3-4 C語言的資料型態
王豐緒 銘傳大學資訊工程學系 問題:JAVA 物件檔輸出入.
Lesson 17 Renting an Apartment 租房子
丙級電腦軟設-VB程式設計 資料來源:林文恭研究室 整理:張福生.
C++程序设计 string(字符串类) vector(容器类).
本章中將會更詳細地考慮有關重複的概念,並且會 介紹for和do…while等兩種用來控制重複的敘述 式。 也將會介紹switch多重選擇敘述式。 我們會討論直接和迅速離開某種控制敘述式的 break敘述式,以及用來跳過重複敘述式本體剩餘 部份的continue敘述式。 本章會討論用來組合控制條件的邏輯運算子,最後.
第1章 C++程序设计基础 网络游戏开发-C++程序设计.
Java程序设计 第2章 基本数据类型及操作.
樹 2 Michael Tsai 2013/3/26.
編譯程式設計 期末專題說明 V1.1 May 2004.
第七章 操作符重载 胡昊 南京大学计算机系软件所.
Chapter 5 Recursion.
如何讓孩子成為明日之星 芃芃森林幼稚園 許玉芳 園長.
第7章 陣列與指標 7-1 陣列的基礎 7-2 一維陣列的處理 7-3 二維與多維陣列的處理 7-4 陣列的函數參數
C++程序语言设计 Chapter 3: The C in C++.
Classes (2) Lecture 7.
C++ 程式設計 基礎篇 張啟中 Chang Chi-Chung.
第三章 链表 单链表 循环链表 多项式及其相加 双向链表 稀疏矩阵.
计算机问题求解 – 论题3-2 - 贪心算法 2018年09月18日.
|09 陣列.
潘爱民 C++ Overview 潘爱民
Speaker: Liu Yu-Jiun Date: 2009/4/29
顺序表的删除.
計算機程式 授課教師:廖婉君教授 第六單元 Arrays
Expressions & Statements
Array I 授課教師 Wanjiun Liao
保留字與識別字.
Speaker: Liu Yu-Jiun Date: 2009/5/6
工數報告 球球與彈簧的華爾滋 河工2B 黃亭嘉 郭宛棋 林于凱 黃乙玲 張舒茹.
Inheritance -II.
字符串 (String) 字符串是 n (  0 ) 个字符的有限序列, 记作 S = “c1c2c3…cn” 其中,S 是串名字
C qsort.
计算机问题求解 – 论题1-5 - 数据与数据结构 2018年10月16日.
第二讲 基本数据类 型及数组等 此为封面页,需列出课程编码、课程名称和课程开发室名称。
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
C/C++基礎程式設計班 C++: 物件的使用、參考、重載函式 講師:林業峻 CSIE, NTU 3/28, 2015.
第 8 章 标准模板库STL 陈哲 副教授 南京航空航天大学 计算机科学与技术学院.
進階 WWW 程式設計 -- PHP Array 靜宜大學資訊管理學系 蔡奇偉副教授
2012 程式設計比賽 Openfind 天使帝國 v2.0 (蓋亞的紋章).
Oop7 字串 String.
C++语言程序设计 C++语言程序设计 第十一章 异常处理 C++语言程序设计.
字串 第10章 part I 8/30/2019.
變數與資料型態  綠園.
C++程序语言设计 Chapter 14: Templates.
Presentation transcript:

Arrays, Vectors & Strings Lecture 3

Built-in arrays 数组 int a[5] = {1, 2, 4, 8, 16}; a 1 2 4 8 16 An array is a container of unnamed objects of a single type that we access by position. Container Unnamed objects Single type Access by position int b = a[2]; a[3]=7;

Built-in arrays Definition / initialization int a[5] = {1, 2, 4, 8, 16}; int b[5] = {1, 2, 4}; // ok. equivalent to int b[5] = {1, 2, 4, 0, 0}; int c[ ] = {1, 2, 4, 8, 16}; // ok. equivalent to int c[5] = {1, 2, 4, 8, 16}; const size_t N = 5; int d[N] = {1, 2, 4, 8, 16};

Built-in arrays You CAN NOT do the following. int a[4] = {1, 2, 4, 8, 16}; // error: excess elements in array initializer int b[5] = {1, 2, 4, 8, 16}; int c[5] = b; // error: array initializer must be an initializer list

Built-in arrays Array names are converted to (constant) pointers. a 1 int a[5] = {1, 2, 4, 8, 16}; 1 2 4 8 16 a int *p = a; // ok. 1 2 4 8 16 const int *q = a; // ok. int b = 3; a = &b; // error: array type ‘int [5]’ is not assignable.

Built-in arrays Array names are converted to (constant) pointers. a 1 2 4 8 16 a int a[5] = {1, 2, 4, 8, 16}; 1 2 4 8 16 int b = *a; // ok. equivalent to int b = a[0]; int c = *(a + 3); // ok. equivalent to int c = a[3]; pointer arithmetic

Built-in arrays Array names are converted to (constant) pointers. a 1 2 4 8 16 a int a[5] = {1, 2, 4, 8, 16}; 1 2 4 8 16 int **p = &a; int (*q)[5] = &a; cout << **q << endl; cout << *(*q + 4) << endl; // error: 不能用int (*)[5]初始化int ** // ok. // ok. the result is 1. // ok. the result is 16.

Array index out of bounds int a[5] = {1, 2, 4, 8, 16}; cout << a[5]; // warning: array index 5 is past the end of the array cout << *(a + 5); // problematic, but will be accepted by the compiler All warnings should be treated as errors.

Bounds checking const size_t N = 5; int a[N] = {1, 2, 4, 8, 16}; size_t j = 0; // … some other code if (j >= 0 && j < N) { // do something with element a[j] } else { // report an index-out-of-bound error size_t j = 0; // … some other code assert (j >= 0 && j < N); // do something with element a[j]

Bounds checking Think: What is the benefit of bounds checking? What is the cost of bounds checking? Should we enforce bounds checking when designing a programming language?

vector // an empty vector vector<int> a; // a vector with ten 0s vector<int> b(10); // a vector with ten 0s vector<int> c(10, 1); // a vector with ten 1s vector<int> d{1, 2, 4, 8, 16}; // supported by C++11 g++ -c some_file.cpp -o some_file.o -std=c++11 int arr[5] = {1, 2, 4, 8, 16}; vector<int> v(begin(arr), end(arr));

push_back 1 2 3 4 5 size = 5, capacity = 8 vector<int> v; 1 / 1 2 / 2 3 / 4 4 / 4 5 / 8 6 / 8 7 / 8 8 / 8 9 / 16 10 / 16 11 / 16 12 / 16 13 / 16 14 / 16 15 / 16 16 / 16 17 / 32 18 / 32 vector<int> v; for (int i = 0; i != 18; ++i) { v.push_back(i); cout << v.size( ) << “ / “ << v.capacity( ) << endl; } 1 2 3 4 5 size = 5, capacity = 8 Tested on macOS High Sierra ver. 10.13.6 with 3.1 GHz Intel Core i7 [Oct 12, 2018]

at vs. operator [ ] vector<int> v{1, 2, 4, 8, 16}; v[7] = 9; cout << v[7] << endl; v.at(7) = 9; cout << v.at(7) << endl; No bounds checking. Undefined behavior. Bounds checking. Throw a runtime out_of_range exception.

Iterators vector<int> v{1, 2, 4, 8, 16}; 迭代器 vector<int> v{1, 2, 4, 8, 16}; 指向v的第一个元素 相等判断,而非大小判断 vector<int>::iterator it = v.begin( ); for ( ; it != v.end( ); ++it) cout << *it << ” ”; 指向v的最后一个元素的下一个位置 Dereference,取指向位置的值 迭代器向后移动一个位置

Iterators 1 2 3 4 5 Think: Why left-closed, right-open? begin( ) end( ) 1 2 3 4 5 Think: Why left-closed, right-open? Why do we use != instead of < or <=?

Iterators int arr[ ] = {1, 2, 4, 8, 16}; begin(arr) / end(arr) int arr[ ] = {1, 2, 4, 8, 16}; vector<int> v(begin(arr), end(arr)); array arr iterator Overload vector<int>::iterator it; for ( it = begin(v); it != end(v); ++it ) { // do something } vector v iterator begin(v) / end(v) 实际调用v.begin( )和v.end( ) 重载:在同一个可见域中为不同的函数赋予同样的名字。

erase C++ Reference http://www.cplusplus.com/reference/vector/vector/erase/ 函数声明 删除一个迭代器指向的位置上的值 删除两个迭代器之间的所有值(左闭右开) 返回一个新的迭代器,指向最后一个被删除值的下一个位置(可能是end)。 vector上原有的迭代器,在position/first之前的继续有效,在position/first及其后的失效。

erase vector<int> v{1, 2, 4, 8, 16, 32, 64, 128, 256}; vector<int>::const_iterator it = v.begin( ) + 3; v.erase(it); cout << *it; // ok. erase 8. return value ignored. 1, 2, 4, 16, 32, 64, 128, 256 // dangerous: iterator invalidated. (undefined behavior) it = v.erase(v.begin() + 1, v.begin() + 4); cout << *it; // ok. erase 2, 4, 16. it points to 32. // ok. print 32. 1, 32, 64, 128, 256

erase 16 vector<int> v{1, 2, 4, 8, 16, 32, 64, 128, 256}; vector<int>::const_iterator it = v.begin( ) + 3; v.erase(it); cout << *it; // ok. erase 8. return value ignored. // dangerous: iterator invalidated. (undefined behavior) 16 未定义行为:C++标准未明确规定,因此相应情况的具体处理取决于各个编译器的具体实现。 正确的程序不应当依赖未定义行为。 学习过程中应注意区分哪些行为是C++标准、哪些行为是编译器扩展。 Tested on macOS High Sierra ver. 10.13.6 with 3.1 GHz Intel Core i7 [Oct 12, 2018]

erase 如果删除的不是最后一个元素,那么erase需要移动被删除位置后的所有数据来填充因为删除而产生的“空位”。

Strings H e l o , W r d ! \0 Null-terminated string “Hello, World!” null character Null-terminated string “Hello, World!” H e l o , W r d ! \0 char s1[14] = {'H’, 'e’, 'l’, 'l’, 'o’, ',’, ' ‘, 'W’, 'o’, 'r’, 'l’, 'd’, '!’, '\0'}; cout << s1 << endl; Hello, World! char s2[ ] = {'H’, 'e’, 'l’, 'l’, 'o’, ',’, ' ‘, 'W’, 'o’, 'r’, 'l’, 'd’, '!’, '\0'}; cout << s2 << endl; Hello, World! char s3[ ] = “Hello, World!”; cout << s3 << endl; Hello, World! 14 cout << sizeof(s3) / sizeof(char) << endl;

Strings H e l o , W r d ! \0 Null-terminated string “Hello, World!” null character Null-terminated string “Hello, World!” H e l o , W r d ! \0 const char *s4= “Hello, World!”; cout << s4 << endl; Hello, World! char *s5= “Hello, World!”; // warning: ISO C++11 does not allow conversion from string literal to ‘char *’ cout << s5 << endl; Tested on macOS High Sierra ver. 10.13.6 with 3.1 GHz Intel Core i7 [Oct 12, 2018]

string string: a variable-length sequence of characters

string string s1; // empty string string s2(“Hello, World!”); string s3(s2); // Hello, World! string s4(s2.begin( ), s2.begin( ) + 5); // Hello left-closed, right-open

string string s1(“Hello”); cout << s1.length( ) << endl; string s2(“World”); cout << (s1 == s2) << endl; string s3 = s1 + “, “ + s2 + “!”; cout << s3 << endl; string s4 = s3.substr(7, 10); cout << s4 << endl; 5 // equivalent to s1.size( ) // string comparison (matching) // string concatenation Hello, World! // substring. 10 characters starting from s3[7]. World!

string operations push_back( ) 添加字符到串尾,有与vector类似的capacity增长策略 insert( ) & erase( ) empty( ) & clear( ) at( ) & operator [ ] data( ) & c_str( ) begin( ) & end( ) find( ) 添加字符到串尾,有与vector类似的capacity增长策略 插入、删除,有与vector类似的迭代器失效问题 判断是否为空 / 清空(并不实际释放内存) 元素操作,at有自动的bounds checking,而[ ]没有 获取C-style的字符串char *(两个函数等价) 迭代器,分别指向首字符和尾字符的下一个位置 查找(字符或子串)

Next lecture C++ Primer, Chapters 4 & 5