板凳——————————————————c++(36)

//The c++ standard library 2nd p177
/*
关联式容器由二叉树实现出来。
1,在二叉树中,每个元素(节点)都有一个父节点和两个子节点,左子树的所有元素都比自己小,右子树的所有元素都比自己大。关联容器的差别主要在于元素的种类以及处理重复元素时的方式。
2,关联式容器的主要优点是,它能很快找出一个具有某特定 value 的元素,因为它具备对数复杂度,而任何循序式容器的复杂度是线性。
3,有一个缺点是,你不能直接改动元素的 value ,因为那会破坏元素的自动排序。
4,所有关联式容器都有一个可供选择的 template 实参,指明排序准则,默认采用操作符 <。
5,排序准则也被用来测试等同性:如果两个元素的 value/key 互不小于对方,则两者被视为重复。p177

#include
#include
#include
#include

int main(){
std::multisetstd::string cities{
“Braunschweig”, “Hanover”, “Frankfurt”, “New York”,
“Chicago”, “Toronto”, “Paris”, “Frankfurt”
};
for(const auto& elem : cities){
std::cout << elem << " ";
}
std::cout << std::endl;

cities.insert({"London", "Munich", "Hanover", "Braunschweig"});

for(const auto& elem1 : cities){// const auto& 希望从容器推断元素类型, 并避免为"被此循环叫唤"的每一个元素
    std::cout << elem1 << " ";  //  制造一份拷贝
}
std::cout << std::endl;

//      int as key,   string as value;
std::multimap<int, std::string> coll1;
coll1 = { {5, "tagged"}, {2, "a"}, {1, "this"}, {4, "of"}, {6, "strings"},
         {1, "is"}, {3, "multimap"}  };
for(auto elem2 : coll1){
     std::cout << elem2.second << ' ';
}
std::cout << std::endl;
return 0;

}
/*
wannian07@wannian07-PC:~$ g++ -std=c++17 -o c17 c17.cpp
wannian07@wannian07-PC:~$ ./c17
Braunschweig Chicago Frankfurt Frankfurt Hanover New York Paris Toronto
Braunschweig Braunschweig Chicago Frankfurt Frankfurt Hanover Hanover London Munich New York Paris Toronto

this is a multimap of tagged strings

*/

//The c++ standard library 2nd p181
/*
1,无序容器而言,某次插入操作可能对其他元素位置造成影响(rehashing,删除操作不会造成rehashing)。我们唯一关心的是,某个特定元素是否位于容器内。可以理解为无序容器是个袋子。
2,无序容器常以hash table实现出来,内部结构是一个“由linked list组成”的array。通过某个hash函数计算,确定元素落于这个array的位置。Hash函数运算的目标是:让每个元素的落点(位置)有助于快速访问任何一个元素。
3,无序容器优点是,查找一个带有特定值的元素,其速度肯能快过关联式容器。事实上无序容器提供的是摊提式常量复杂度,前提是有一个良好的hash函数。然而这并不简单,你可能需要提供许多内存作为bucket。
4, unordered set 无序元素集合。每个元素只可出现一次, 不允许元素重复
unordered map 键/值key/value pair。每个key只可出现一次。
unordered multiset 允许元素重复, 可能内含多个有着相同value的元素
unordered multimap 允许重复,可能内含多个"拥有着相同key"的元素. 可以作为字典
*/

#include <unordered_set>
#include
#include
#include <unordered_map>
int main(){
std::unordered_multisetstd::string cities{
“Braunschweig”, “Hanover”, “Frankfurt”, “New York”,
“Chicago”, “Toronto”, “Paris”, “Frankfurt”
};
for(const auto& elem : cities){
std::cout << elem << " ";
}
std::cout << std::endl;

cities.insert({"London", "Munich", "Hanover", "Braunschweig"});

for(const auto& elem1 : cities){
    std::cout << elem1 << " ";  
}
std::cout << std::endl;

std::unordered_map<std::string, double> coll1{{"tim", 9.9},
          {"struppi", 11.77}};
for(std::pair<const std::string, double>& elem : coll1){
      elem.second *= elem.second;
      //无法改动元素的key, 就是first成员
      //elem.first = ...; //error : keys of a map are constant
}
for(const auto& elem : coll1){
      std::cout << elem.first << ":" << elem.second << std::endl;
}
//map,unordered_map,都是key/value pair形成的集合, 每个元素带着独一无二的key,
// 都提供了下标操作符[]
 std::unordered_map<std::string, float> coll2;  //p185

         coll2["VAT1"] = 0.16;

// coll2.at(“VAT1”) = 0.16; //p186
//terminate called after throwing an instance of ‘std::out_of_range’
coll2[“VAT2”] = 0.07;
coll2[“Pi”] = 3.1415;
coll2[“an arbitrary number”] = 4983.223;
coll2[“Null”] = 0;
// change value
coll2[“VAT1”] += 0.03;
// print difference of VAT values // 0.16+0.03-0.07 = 0.12
std::cout << "VAT difference: " << coll2[“VAT1”] - coll2[“VAT2”] << std::endl;

/*p188
Container Adapter是预定义的容器,提供的是一定限度的接口,用于处理特殊需求。这些容器都是根据基本容器定义实现的。
Stack 对元素采用LIFO管理策略。
Queue 对元素采用FIFO策略。 (默认为操作符<)
Priority queue 其内元素拥有优先权。优先权乃是基于程序员提供的排序准则而定义的。效果相当于这样一个缓冲区:下一元素永远是容器中优先权最高的元素。如果同时有多个元素具备最高优先权, 则其次序无明确定义.

/
}
/

wannian07@wannian07-PC:~$ g++ -std=c++17 -o c17 c17.cpp
wannian07@wannian07-PC:~$ ./c17
Paris Toronto Chicago New York Frankfurt Frankfurt Hanover Braunschweig
// 次序变化 取决于rehashing策略, 某种程度上可被程序员影响.
// 删除元素不会引发rehashing, 但删除之后的一次安插动作就有可能引发rehashing.
Munich London Frankfurt Frankfurt New York Braunschweig Braunschweig Chicago Toronto Hanover Hanover Paris

struppi:138.533
tim:98.01
VAT difference: 0.12

*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值