码迷,mamicode.com
首页 > 编程语言 > 详细

c++标准库和stl

时间:2015-04-24 20:48:34      阅读:228      评论:0      收藏:0      [点我收藏+]

标签:

C++中有三大重要的标准库,为string、vector、bitset,他们每个都是一个类,对应的命名空间均为std。string类的对象可以存 储一个字符串,相应于C中存储字符串的方式,C++的优点是,在创建对象时可以不指定长度,在连接和删除中,只需要使用进行算符重载后了的“+”和 “-”。vector类的对象可以存储一个数组,可以int,char,string等,使用时,就像一个栈一样,通过push_back、 pop_back等进行操作,这是与一般数组不一样的地方。

String 类

1 string + “ ”  ok

2 string + string ok

3 “ ”     + string   ok

string s1 = "test";

string s2 = s1 + "orange" + "apple";

string s3 = "orange" + s2 + "banana";

string s4 = s3 + "a"

包括,顺序容器,关联容器,迭代器,算法等。其中,vectorlist属于顺序容器,maplistmultimapmultiset属于关联容器。

 

 vector

  • vector的底层是用动态数组实现的,支持下标操作。
  • push_back实际是放入的元素的副本,所以要求元素具有复制的能力。
  • 在用vector创建n个对象时(格式为,vector vec(n, class())),先用class类的构造函数class()创建一个临时对象,然后再用拷贝构造函数,将这个临时对象拷贝n份到vec空间中。
  • vector没有push_front
  • vector中,size是存储的元素数量,resize是改变当前存储的元素数量,这两个函数都属于第一种容量。而capacity表示vector的最大容量,reserve可以改变最大容量。
  • vector的内存分配策略: 
    a) 定义空数组时,capacity0,当制定vec大小为n的时候,capacity也为n。 
    b) capacity占满的时候,此时再次放入元素,capacity变为原来的两倍。
  • list的底层是一个链表,不支持下标操作。
  • listpush_front,push_back等操作。
  • map是一种pair的容器,存储多个pair
  • map中的元素按照key进行从小到大排列。
  • map的底层实现是采用二叉树,一般是使用红黑树。
  • map对容器的要求:key类型必须支持比较,而value不做要求。
  • map的中某个key的引用操作为:map(key),它返回的是一个左值。
  • 使用下标访问map中不存在的key时,会增加一个新的keyvalue为一个初始化值(对于类类型的value,会用默认构造函数初始化,对于内置类型,初始化为0)。
  • 下标操作除了可以用于插入之外,还可以用来访问已经存在的key,进而更新value
  • mapkey值是不可更改的。
  • countfind的区别。count仅仅用于查看map中是否存在某一个key(对于mapcount的返回值为01,0表示这个key 不存在,1表示存在)。find用于查看某个key的位置(通过与.end()的比较,得到这个key是否存在于这个map之中,若在map中,则可以读 取则个key对应的value)。
  • 插入操作除了可用下标的方式之外,还可以用insertinsert是有返回值的,类型为pair,第一个参数为迭代器,第二个参数表示是否插 入成功。若这个key没在map中,则第二个参数返回为true,表示插入成功;若这个keymap中,则第二个参数返回为false,表示插入失败, 此时不会更新value值。
  • set底层采用红黑树实现,按照值进行排序。
  • set中的元素都是唯一的(因为set是一个集合)。

 list

 map

set

multimap

一个key值对应多个value,用法与map类似

unordered_map

它是c++11boost库中的一个类模板,类似于hash表,用法类似于map

 一些需要注意的问题

  • map> vec;这样定义是错误的,因为>>是一个符号,而不是两个>符号,而模板中,是以<为开始符,>为终结符,因此上面的定义中,编译器无法读到>终结符,导至误
    不能直接用vec初始化list,也不能直接用list初始化vecqueue也一样。但是可以通过迭代器指定一个list中的某段空间去初始化vec类的对象,或者可以通过迭代器指定一个list中的某段空间去初始化vec类的对象。
  • 又需要对容器进行插入操作,而插入操作又是插入某个对象或变量的副本,因此,STL容器内的元素必须支持复制和赋值。
  • 在容器中删除元素时,会导致该元素的迭代器失效,所以当使用erase时,应该用迭代器接收返回值。

 

3vector 中 若规定大小,则和数组一样,用数组操作,用push-back()不能正确放入a[i] = “   “;

若没有规定大小,则可用push放入,操作也可采用数组

例:#include <iostream>

#include <string>

#include <vector>

using namespace std;

int main(){

vector<string> words;

    words.push_back("zero");

words.push_back("one");

cout<<words[0]<<endl;

int x;

cin>>x;

// cout<<words.size()<<endl;

switch (x){

case 0:cout<<words[0]<<endl;

break;

case 1:

cout<<words[1]<<endl;

break;

case 2:

cout<<words[2]<<endl;

break;

default:

break;

}

}

#include <iostream>

#include <string>

#include <vector>

using namespace std;

int main(){

vector<string> words(9);

   words[0] = "zero";

   words[1] = "one";

cout<<words[0]<<endl;

int x;

cin>>x;

 

switch (x){

case 0:cout<<words[0]<<endl;

break;

case 1:

cout<<words[1]<<endl;

break;

case 2:

cout<<words[2]<<endl;

break;

default:

break;

}

}

stl  map

1map的添加和查询

#include <iostream>

#include <map>

#include <string>

using namespace std;

int main(){

map<string,int> m1;

    m1["beijing"] = 100;

    m1["shenzhen"] = 200;

    m1["shanghai"] = 300;

    cout<<m1["shanghai"]<<endl;

    map<string,int>::iterator it = m1.begin();

    while(it != m1.end()){     //这样比较 

     cout<<it->first<<"  "<<it->second<<endl;

     it++;

}

return 0;

}

2每当用下标去访问map元素的时候,如果该元素不存在,那么首先在map中新生成一个键值对。所以用下标访问不存在的键值对,会增加容器的大小,map 中键的顺序一般是按照字母顺序排序的。

#include <iostream>

#include <map>

#include <string>

using namespace std;

void print(const map<string,int>::value_type &p) {

   cout<<p.first<<"   "<<p.second<<endl;

}

int main(){

 map<string,int> word_count;

string word;

while(cin>>word){

if(word != "abc"){

word_count[word]++;

}

else

break;

}

map<string,int>::iterator it = word_count.begin();  //常用遍历map的方式

while(it != word_count.end()){

cout<<it->first<<"   "<<it->second<<endl;

it++;

}

return 0;

}

word_count.insert(map<string,int>::value_type("abc",10)); //map中插入语句

    map<string,int>::iterator it1 = word_count.find("abc");//map中的查找语句

word_count.erase("abc");   //删除语句

Set map类似,不能插入两个一样的值

c++标准库和stl

标签:

原文地址:http://www.cnblogs.com/jerrmylei/p/4454344.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!