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)
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言