千慮一得齋OnLine_觀死書齋-Yahoo/Hexun/Blogger/sina/Xuite

觀死書齋暨Spread、和訊博客全文檢索

2019年10月31日 星期四

C++自修入門實境秀、C++ Primer 5版研讀秀 73/ ~ v11關聯式容器~11.3.3. Erasing Elements





11.3.2. Adding Elements

在關聯式容器中新增元素、加入元素

關聯式容器的加入元素運算(容器運算)



7:10

頁432

Table 11.4. Associative Container insert Operations

表11.4 :關聯式容器的insert運算

c.insert(v) c.emplace(args) v是value_type物件;args用來建構一個元素。對map和set來 說,元素只會在具有給定鏈值的那個元素尚未出現在c中的時候才 會被插入(或建構)。回傳一個pair,其中含有一個迭代器指向具 有給定鍵值的那個元素,以及一個bool指出該元素是否是被插入的→指出該元素是否已被插入。Returns a pair containing an iterator referring to the element with the given key and a bool indicating whether the element was inserted.

對multimap與multiset來說,插入(或建構)所給的元素,並回傳一個迭代器指向新的元素。

c.insert(b, e)

c.insert(il) b和e是代表一個範圍的c::value_type值的迭代器;il(initializer list)是大括號圍起的這種值的一個串列。

il is a braced list of such values.

回傳void。對map和set來說,若鍵值尚未在c中,就插入元素。對multimap與multiset來說, 插入該範圍中的每個元素。

c.insert(p,v)

c.emplace(p, args) 就像insert(v)(或emplace(args)),但使用迭代器p作為一個提示,告知應該從哪裡開始找尋要儲存那個新元素的地方。回傳一個迭代器指向具有給定鍵值的元素。

Like insert (v) (or emplace (args)), but uses iterator p as a hint for where to begin the search for where the new element should be stored. Returns an iterator to the element with the given key.

關聯式容器既然與元素儲存的「位置」無關(頁423),又何故要「where」?!這真的有趣(趣味小品的趣)

50:00 2:29:40



// four ways to add word to word_count

word_count.insert({word, 1});

word_count.insert(make_pair(word, 1));

word_count.insert(pair<string, size_t>(word, 1));

word_count.insert(map<string, size_t>::value_type(word, 1));



學習程式設計之必要

51:20工欲善其事必先利其器 有事弟子服其勞 電子計算機

1:11:33隨便下一個pptx檔來將圖文內容匯出至Word

1:10:20 1:24:59

Word VBA選取區字符汰重(直接刪除重複者)

1:31:30 增修程式碼完成,測試中……

測試成功,效能也提升了! 2:21:00



頁432

Testing the Return from insert

2:38:30

The value returned by insert (or emplace) depends on the container type and the parameters.

對於鍵值不可重複的關聯式容器,(即non-multi)傳回來的pair型別中,第一個成員是表示一個指向被插入元素(鍵值)的迭代器;第二個成員則表示插入是否完成,或已經有相同的鍵值在原容器中了

頁433

Unwinding the Syntax

解讀語法

Adding Elements to multiset or multimap

新增元素到 multiset或multimap

3:9:50

頁434

練習11.20

3:17:10

#include<iostream>

#include<map>

using namespace std;

int main() {

// count the number of times each word occurs in the input

map<string, size_t> word_count; // empty map from string to size_t

string word;

while (cin >> word)

{

pair<map<string, size_t>::iterator, bool> inR = word_count.insert({ word, 1 });

if (!inR.second) ++inR.first->second;

}

//++word_count[word]; // fetch and increment the counter for word

for (const auto& w : word_count) // for each element in the map

// print the results

cout << w.first << " occurs " << w.second

<< ((w.second > 1) ? " times" : " time") << endl;

}

3:26:01

練習11.21

#include<iostream>

#include<map>

using namespace std;

int main() {

// count the number of times each word occurs in the input

map<string, size_t> word_count; // empty map from string to size_t

string word;

while (cin >> word)

++word_count.insert({ word, 0 }).first->second;//其實就是下面(即練習11.20)的濃縮

//while (cin >> word)

//{

// pair<map<string, size_t>::iterator, bool> inR = word_count.insert({ word, 1 });

// if (!inR.second) ++inR.first->second;

//}

//原來的下標(subscript)運算

//++word_count[word]; // fetch and increment the counter for word

for (const auto& w : word_count) // for each element in the map

// print the results

cout << w.first << " occurs " << w.second

<< ((w.second > 1) ? " times" : " time") << endl;

}

3:37:17

練習11.22

#include<iostream>

#include<map>

#include<vector>

using namespace std;

int main() {

map<string, vector<int>> m;

string word;

int i;

vector<int>v;

while (cin >> word)

{

cin >> i;

v.push_back(i);

cin >> i;

pair<map<string, vector<int>>::iterator, bool> insResult =

m.insert(pair<string, vector<int>>(word, v));

if (!insResult.second) insResult.first->second.push_back(i);

//以上3行程式碼可濃縮為下一式

//(m.insert(pair<string,vector<int>>(word,v)).first->second).push_back(i);

}

for (const auto& w : m) // for each element in the map

// print the results

cout << w.first << " occurs " << w.second.back()

<< ((w.second.size() > 1) ? " times" : " time") << w.second.size()<<

endl;

}

4:0:55

練習11.23

練習11.7

#include<iostream>

#include<map>

#include<vector>

#include<iterator>

using namespace std;

int main() {

multimap<string, vector<string>> m;

istream_iterator<string>in(cin), end;

string lastName; vector<string>v;

while (in != end)

{

lastName = *in;

m.insert(pair<string, vector<string>>(lastName, v))->second.push_back(*++in);

++in;

}

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

for (auto a : m)

{

cout << a.first << ":";

copy(a.second.cbegin(), a.second.cend(), out);

cout << endl;

}

}

Word VBA 漢字部件數程式碼增修

4:16:00 5:8:00 完成。可以照系統內定的簡化字排序 https://snipsave.com/oscarsun72/#/snippet/QJJh5ASJTQfBeHtYIT

11.3.3. Erasing Elements

11.3.3清除元素

4:15:10

erase()成員函式

和循序容器(sequential container)的操作都很類似

5:11:10

頁435

Table 11.5. Removing Elements from an Associative Container

表11.5 :從一個關聯式容器移除元素

c.erase (k) 從c移除每個具有鍵值k的元素。回傳size_type指出所移除的元素數。

c.erase (p) 從c移除迭代器p所代表的元素。p必須實際指向c中的一個元素;它必須不等於c.end()。回傳一個迭代器指向p後的元素,或在p代表c中最 後一個元素時,回傳c.end()。

c.erase(b, e) 移除迭代器對組b和e所表示的範圍中的元素。回傳e。

正文說不回傳這表卻說回傳:

These versions of erase are similar to the corresponding operations on sequential containers: The indicated element(s) are removed and the function returns void.

11.3.4. Subscripting a map

11.3.4為一個map添標

中文版前均翻成「下標(subscript)」

→對map容器下標(subscript)

沒有留言:

張貼留言