C++自修入門實境秀、C++ Primer 5版研讀秀 68/ ~ v11關聯式容器 Chapter 11. Associative Cont...





2:10

Finding and using color themes in Visual Studio

難得又有我會的,或難不倒我的。呵呵

15:00

C# 如何將PowerPoint pptx檔內的圖片、文字方塊、備忘稿等輸出到MS Word docx文件中。

Visual Studio 2017 16:00

加入PowerPoint、Word參考

2:13:00 成功了

2:19:00在C# 表單中設定預設按鈕,只能用程式來跑

this.AcceptButton = button1;

2:28:00 備忘稿判斷

Slides(n).HasNotesPage

判斷含不含文字方塊是用Shape的HasTexFrame這個屬性來判斷!

有沒有PowerPoint的指令名稱是用Has 哈

2:31:30

處理簡報檔備忘稿的部分

2:53:00成功

2:54:20

點文字方塊直接貼上剪貼簿內容

3:36:00

〈PowerPoint怎样用VBA?〉

4:00:10完成,發布到GitHub

https://snipsave.com/oscarsun72/#/snippet/Ijab13x0VaJs4hCA18

圓滿 4:4:30

將PowerPoint簡報檔內的圖片、文字方塊、備忘稿等輸出到MS Word docx文件中

歡迎下載試用。未學所作,沒有智慧財產。與諸佛菩薩結緣。

也歡迎回饋問題或改進意見。感恩感恩 南無阿彌陀佛



10.5.2. Algorithm Parameter Patterns

10.5.2演算法參數模式

演算法參數的模型

演算法的參數模型 5:10:00

5:47:10 演算法的參數模樣(參數長的樣子、長得什麼樣)

Superimposed on any other classification of the algorithms is a set of parameter conventions.

在其他分類法上,存在一套參數的公約制約著演算法的義界與作用。

Understanding these parameter conventions can aid in learning new algorithms

了解這些公約對認識陌生不熟悉的演算法是很有用的。

—by knowing what the parameters mean, you can concentrate on understanding the operation the algorithm performs.

因為當您明白了某個演算法的參數是怎樣的,您就能夠集中心力去瞭解這個個演算法它是怎麼運作的。

Most of the algorithms have one of the following four forms:

forms=patterns

大部分的演算法都至少具備下面四種形式/模式/模樣的其中一個:

alg (beg, end, other args);

alg (beg, end, dest, other args);

alg (beg, end, beg2, other args);

alg (beg, end, beg2, end2, other args);

其中alg是演算法的名稱,而beg和end代表演算法要作用在其上的輸入範圍。雖然幾乎所有的演算法都接受一個輸入範圍,其他參數的出現與否,則取決於所要進行的工作。列於這裡最常見的dest、beg2與end2全都是迭代器。使用時,這些迭代器都扮演類似的角色。除了這些迭代器參數(iterator parameters)外,有些演算法也接受額外的非迭代器參數(noniterator parameters),它們是某個特定的演算法自行限定的。不見題目只見關鍵字

「限定」就像日語「季節限定」之限定。這裡用「指定」才像中文。

所謂輸入⑧找對主詞 是要輸入給演算法用來處理的(範圍)也就是演算法要「拿來」用的(範圍),就叫「輸入範圍(input range)」

前面輸入迭代器(input iterator)之輸入也是此義(是由元素輸入到迭代器)

5:29:10

③字形結構兼音義 真是到處是九陽神功 !

原來「Clang」是「C language」啊

the presence of the other parameters depends on the work being performed.

其他參數的出現與否

→有沒有其他參數則取決於該演算法打算進行何種操作

頁413

Algorithms with a Single Destination Iterator

An ostream_iterator writes to an output stream, again presenting no problem regardless of how many elements are written.

Algorithms with a Second Input Sequence

These algorithms typically use the elements from the second range in combination with the input range to perform a computation.

這些演算法通常會使用來自第二個範圍的元素與第一個範圍搭配進行一些計算。

typically在這裡翻成「都」就可以了

這些用到第2個範圍的演算法都是藉由第2個範圍來和第1個輸入範圍(input range)作比較運算。

6:24:40

The end of this range is not specified.

沒有指明這個範圍到哪裡

這裡的end要翻成「到」(end末端),到末端隱含有「到」極限的意思

6:27:10

我英文也學好了,真是一箭三鵰、一舉三得!程式語言、英語(英文)、國語(中文)

6:28:50 定共戒:觀念有了,自然就不會犯法(語法)了!這裡的兩個Warning我都定共戒了!「入定」了——有了正確的觀念,自然就不會違背程式語法了。

觀念很重要!

6:39:10

10.5.3. Algorithm Naming Conventions

10.5.3演算法命名慣例

Separate from the parameter conventions, the algorithms also conform to a set of naming and overload conventions.

除了參數慣例外,演算法也遵循一組命名和重載慣例。

6:41:13

6:43:00

Some Algorithms Use Overloading to Pass a Predicate

某些演算法使用重載來傳入一個判斷式

pass和move advance移動不一樣

pass是傳遞引數,別忘了,不是在移動位置、或指移動方向

6:45:30

Algorithms that take a predicate to use in place of the < or == operator, and that do not take other arguments, typically are overloaded.

通常都是重載的。

帶了一個判斷式predicate用來取代<或==的運算的演算法,且又沒帶其他的參數,就是演算法多載的範例

One version of the function uses the element type’s operator to compare elements; the second takes an extra parameter that is a predicate to use in place of < or ==:

6:55:00 這裡function和algorithm又不分了

頁414

unique(beg, end); // uses the == operator to compare the elements

unique(beg, end, comp); // uses comp to compare the elements

重載、多載的演算法

7:1:00

Because the two versions of the function differ as to the number of arguments, there is no possible ambiguity (§ 6.4, p. 233) as to which function is being called.

因為這兩個版本的函式之引數數目有差異

→因為這個函式的兩個版本,不同在於它們引數的個數

這兩個版本的函式好像這兩個是平行的

這裡是說同一個下的分支,所以不能這樣翻譯



7:6:15

Algorithms with _if Versions

帶了一個元素值作為參數的演算法,一般都會有另一個叫做_if的同名演算法。這個掛有「_if」後綴的演算法,會帶一個判斷式(predicate),用來取代原來沒有_if後綴的演算法的那個元素值。

find(beg, end, val); // find the first instance of val in the input range

find_if(beg, end, pred); // find the first instance for which pred is true

這就是所謂演算法的命名規則(這裡是演算法自己的名稱)

這裡「instance」應翻成「目標或對象」

總而言之,為了避嫌(含混)所以不用多載方式重載這樣的函式(演算法),而是另起名字。



Distinguishing Versions That Copy from Those That Do Not

前面講尾綴「_if」的演算法,這裡講尾綴「_copy」的

Do Not 什麼⑧找對主詞 do not Copy



7:23:00

By default通常, algorithms that rearrange elements write the rearranged elements back into the given input range.

通常對元素會毛手毛腳——或者說會對元素動手腳——的演算法,都會家醜不可外揚。關起門來自己幹、不張揚。

肥水不落外人田

張揚版的就是「_copy」

這種演算法會提供另一個版本,好像兩種帳本一樣。

reverse(beg, end); // reverse the elements in the input range

reverse_copy(beg, end, dest);// copy elements in reverse order into dest

Some algorithms provide both _copy and _if versions. These versions take a destination iterator and a predicate:

_copy _if

// removes the odd elements from v1

remove_if(v1.begin(), v1.end(),

[](int i) { return i % 2; });

// copies only the even elements from v1 into v2; v1 is unchanged

remove_copy_if(v1.begin(), v1.end(), back_inserter(v2),

[](int i) { return i % 2; });

7:45:00

#include<iostream>

#include<iterator>

#include<vector>

#include<algorithm>

using namespace std;

int main() {

vector<int>v1{ 1,3,5,6,99,8 }, v2;

// copies only the even elements from v1 into v2; v1 is unchanged

remove_copy_if(v1.begin(), v1.end(), back_inserter(v2),

[](int i) { return i % 2; });

ostream_iterator<int>out(cout, ",");

copy(v2.cbegin(), v2.cend(), out);

cout << endl;

}



7:48:30

原來aka是「also known as」各取頭一個字母的縮寫啊,因此須讀成「also known as」

頁415

練習10.41

7:51:24



8:7:00

list、forward_list定義了許多演算法作為其成員函式,是他種容器所沒有的

Unlike the other containers, list and forward_list define several algorithms as members.

In particular,特別是 the list types define their own versions of sort, merge, remove, reverse , and unique .

Container-Specific就是相對於泛用(generic)的

The generic version of sort requires randomaccess iterators.

泛用的sort演算法必須使用隨機存取迭代器(random-access iterator)來操作

可見Container-Specific就是非泛用的

8:15:00

The generic versions of the other algorithms that the list types define can be used with lists, but at a cost in erformance.但是得付出代價

串列型別所定義的其他演算法的泛用版本可以用於串列,但要以效能作為代價。

類似於泛用型別的而為list容器定義的演算法,雖然可以用於list容器(串列)上,但也得付出代價。因為list本身是不支援隨機存取的,硬要像泛用演算法那樣的操作,就必須付出額外的成本

觀念很重要!

也就是雖然list自定義了諸如sort、reverse這些類似於泛用演算法的計算,但其實真要執行起來,還是挺費事的

8:23:00 懷疑 「list types」是「library」的錯植



These algorithms swap elements in the input sequence. A list can “swap” its elements by changing the links among its elements rather than swapping the values of those elements. As a result, the list-specific versions of these algorithms can achieve much better performance than the

corresponding generic versions.

這些演算法 會調換輸入序列中的元素。一個串列可以藉由變更元素間的連結來「對調(swap)」它的元素,而非對調那些元素的值。結果就是,這些演算法的串列專用版本能夠達到比對應的泛用版本更好的效能。

本來有些泛用的演算法因為需要隨機存取,使得list無法使用,但是list因具備對調(swap)」它元素連結(link)的能力,反而在其自定義的版本中,執行的效能,卻能大大超過泛用型演算法在其他容器上運作的效率。

可見,其他容器不具備調動元素鏈接(link)的能力,反而需要直接處理元素的值,付出的成本自然就較list(串列)型別要多,效能也就因此差了許多

這裡就是處理鏈接還是值的對決。

處理值要付出的成本,是大太多了。尤其當值是一個大數據時……,更不得了

像資料庫中若要刪除或新增大筆記錄,則付出的成本,可想而知

本來是不能用的,反而翻身、翻轉成了優勢!可謂因禍得福、鹹魚翻身;當然也要自己覺性本具,須時以待,否則際遇一來,也只能坐失良機。

既然list有自定義的版本,當然在使用時應優先使用它成員函式的演算法

8:45:40

Table 10.6. Algorithms That are Members of list and forward_list

演算法果然和函式是一掛的,只是它是為了針對容器元素運算而生的函式



8:53:40

表10.6 :是list和forward_list成員的演算法 list專用的演算法

這些運算回傳void。不回傳回值



lst.merge(lst2)

lst.merge(lst2, comp) 將來自lst2的元素合併到lst。lst與lst2都必須排序過。

元素會從lst2被移除。在merge之後,lst2會是空的。第一個版本使用 < 運算子;第二個版本使用所給的比較運算。

lst.remove(val)

lst.remove_if(pred) 呼叫erase來移除==給定值的每個元素,或是使得所給的單元判斷式成立的那些值。

lst.reverse() 反向排序lst中的元素。

lst.sort()

lst.sort(comp) 使用 < 或所給的比較運算來排序lst的元素。

lst.unique()

lst.unique(pred) 呼叫erase來移除相同值的連續拷貝。第一個版本使用==;第二個版本使用所給的二元判斷式。

頁416

9:3:30

The splice Members

一定是跟link有關的

splice是針對串列(list)資料結構特殊演算法

9:14:18

Table 10.7. Arguments to the list and forward_list splice Members

表 10.7 : list 和 forward_list 的 splice 成員之引數

lst.splice(args)或 flst. splice_after(args)

(p, lst2) p是對lst中一個元素的迭代器,或緊接在flst中一個元素前的一個迭代器。將lst2的所有元素移到lst中緊接p之前的位置,或flst中緊接p之後的位置。從lst2移除元素。lst2的型別必須lst或flst一樣,而且不可以是同一個串列。

(p,lst2,p2) p2是指到lst2中的一個有效迭代器。將p2所代表的元素移到lst 中,或移動緊接在p2後的元素到flst 。 lst2跟lst或flst可以是同一個串列。

(p,lst2,b,e) b和e必須代表lst2中的一個有效範圍。移動來自lst2給定範圍中的元素。lst2與lst(或flst)可以是相同的串列,但p必定不能代表所給的範圍中的元素。



9:22:20

The List-Specific Operations Do Change the Containers

不同於一般泛用演算法,list自定義的成員函式(演算法)卻真會改動容器(直接對容器下手)



9:32:20

練習10.42

中文版誤作「練習10.4.2」

#include<iostream>

#include<iterator>

#include<list>

//#include<algorithm>

using namespace std;

void elimDups(list<string>& words)

{

// sort words alphabetically so we can find the duplicates

//sort(words.begin(), words.end());

words.sort();//用list版本的演算法,在unique前一樣要先排序

// unique reorders the input range so that each word appears once in the

// front portion of the range and returns an iterator one past the unique range

//auto end_unique = unique(words.begin(), words.end());

words.unique();//因為list成員函式演算法是直接對list動手的,所以不必再用erase

// erase uses a vector operation to remove the nonunique elements

//words.erase(end_unique, words.end());

//words.erase();

}

int main() {

list<string>lst;

istream_iterator<string>in(cin), end;

copy(in, end, back_inserter( lst));

elimDups(lst);

ostream_iterator<string>out(cout," ");

copy(lst.cbegin(), lst.cend(), out);

cout << endl;

}

10:2:20

頁417

Chapter Summary

標準程式庫定義了大約100個獨立於型別的演算法,它們作用於序列之上。序列可以是某個程式庫容器型別中的元素、一個內建陣列,或(舉例來說)藉由讀取或寫入一個資料流所產生的。

因為獨立於型別所以叫「泛用(generic)」

只要是一序列的資料(元素)就是演算法要處理的對象

演算法是透過迭代器這個幫兇才能達到其借刀殺人的目的:

Algorithms achieve their type independence by operating in terms of iterators.

10:9:10

因為所有序列都具有迭代器,演算法才能藉由迭代器來達到不受型別限制的能力



那些會寫入目的地迭代器的演算法,只需要輸出迭代器的動作,依此類推。

those ⑧找對主詞 所代的對象是演算法(algorithm),不是迭代器

→會寫入迭代器所表的目的地序列的演算法

也就是:有個指向目的地序列的迭代器參數的演算法

10:24:50

Defined Terms

back_inserter

Iterator adaptor that takes a reference to a container and generates an insert iterator that uses push_back to add elements to the specified container.

會根據被賦予的容器產生出一個針對其容器操作的插入型迭代器

binary predicate

Predicate that has two parameters.

10:31:40

bind

Library function that binds one or more arguments to a callable expression. bind is defined in the functional header.

callable object

Object that can appear as the left-hand operand of the call operator. Pointers to functions, lambdas, and objects of a class that defines an overloaded function call operator are all callable objects.

以及定義有重載的函式呼叫運算子的類別之物件,都是可呼叫物件。

10:35:20

cref

Library function that returns a copyable object that holds a reference to a const object of a type that cannot be copied.

10:41:30

頁418

front_inserter

Iterator adaptor that, given a container, generates an insert iterator that uses push_front to add elements to the beginning of that container.

10:42:30

generic algorithms

Type-independent algorithms.

10:43:30

insert iterator

Iterator adaptor that generates an iterator that uses a container operation to add elements to a given container.

inserter

Iterator adaptor that takes an iterator and a reference to a container and generates an insert iterator that uses insert to add elements just ahead of the element referred to by the given iterator.

iterator categories

For example, some algorithms require only input iterators. Such algorithms can be called on any iterator other than one that meets only the output iterator requirements.

可見輸入迭代器(input iterator)與輸出迭代器(output iterator)是同一品秩(等級)的

可見實際是四品五類,非五類五品

lambda expression

Callable unit of code. A lambda is somewhat like an unnamed, inline function.

程式碼的可呼叫單元。

一個可呼叫的程式單元

10:57:00

move iterator

Iterator adaptor that generates an iterator that moves elements instead of copying them. Move iterators are covered in Chapter 13 .

(移動迭代器)這種迭代器轉接 器產生的迭代器能夠移動元素,而非拷貝它們。 移動迭代器涵蓋於第13章。



11:0:10

predicate

Function that returns a type that can be converted to bool . Often used by the generic algorithms to test elements. Predicates used by the library are either unary (taking one argument) or binary (taking two).

回傳能被轉換為bool的一個型別的函式。通常被泛用演算法用來測試元素。程式庫所用的判斷式要不是單元(接受一個引數)的,就是二元(接受兩個)的。

判斷式(predicate)是個函式

程式庫用上的判斷式只有單元和二元兩種。

11:4:00

ref

Library function that generates a copyable object from a reference to an object of a type that cannot be copied.

頁419

Chapter 11. Associative Containers

關聯式容器

Associative and sequential containers differ from one another in a fundamental way: Elements in an associative container are stored and retrieved by a key.

關聯式容器和循序容器有一個基本差異:關聯式容器中的元素是以一個鍵值(key)來儲存和 取回的。

In contrast, 而 elements in a sequential container are stored and accessed sequentially 依序存取by their position in the container.

這是position和key的對決

雖然關聯式容器(associative container)與循序容器(sequential container)有許多一致的行為

they differ from the sequential containers in ways that reflect the use of keys.

它們跟循序容器的差異就反映在鍵值的使用方式上。

關聯式容器和循序容器不同的地方在於

頁420

Associative containers support efficient lookup and retrieval by a key.

The two primary associative-container types are map and set .

The elements in a map are key–value pairs:

一個map中的元素是鍵值與值對組(key-value pairs):

對組,還真是文言文呢!

The key serves as an index into the map , and the value represents the data associated with that index.

A set element contains only a key; a set supports efficient queries as to whether a given key is present.

A dictionary would be a good use for a map : The word would be the key, and its definition would be the value.

字典(dictionary)會是map的好用處:字詞會是鍵值,而其定義則是值。

字典就是map應用的一個範例

∵ 模範生就是好榜樣 ∴ 好→範

此句應翻成:如果說would假設、比況,字典是map應用的一個絕佳示範,那麼字典中的字詞,就如map的鍵值(key),而該字詞的定義,就是那個值(value)。

留言

熱門文章