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"
包括,顺序容器,关联容器,迭代器,算法等。其中,vector和list属于顺序容器,map、list、multimap、multiset属于关联容器。
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) 定义空数组时,capacity为0,当制定vec大小为n的时候,capacity也为n。
b) 当capacity占满的时候,此时再次放入元素,capacity变为原来的两倍。 - list的底层是一个链表,不支持下标操作。
- list有push_front,push_back等操作。
- map是一种pair的容器,存储多个pair。
- map中的元素按照key进行从小到大排列。
- map的底层实现是采用二叉树,一般是使用红黑树。
- map对容器的要求:key类型必须支持比较,而value不做要求。
- map的中某个key的引用操作为:map(key),它返回的是一个左值。
- 使用下标访问map中不存在的key时,会增加一个新的key,value为一个初始化值(对于类类型的value,会用默认构造函数初始化,对于内置类型,初始化为0)。
- 下标操作除了可以用于插入之外,还可以用来访问已经存在的key,进而更新value。
- map的key值是不可更改的。
- count和find的区别。count仅仅用于查看map中是否存在某一个key(对于map,count的返回值为0或1,0表示这个key 不存在,1表示存在)。find用于查看某个key的位置(通过与.end()的比较,得到这个key是否存在于这个map之中,若在map中,则可以读 取则个key对应的value)。
- 插入操作除了可用下标的方式之外,还可以用insert。insert是有返回值的,类型为pair,第一个参数为迭代器,第二个参数表示是否插 入成功。若这个key没在map中,则第二个参数返回为true,表示插入成功;若这个key在map中,则第二个参数返回为false,表示插入失败, 此时不会更新value值。
- set底层采用红黑树实现,按照值进行排序。
- set中的元素都是唯一的(因为set是一个集合)。
list
map
set
multimap
一个key值对应多个value,用法与map类似
unordered_map
它是c++11boost库中的一个类模板,类似于hash表,用法类似于map
一些需要注意的问题
- map> vec;这样定义是错误的,因为>>是一个符号,而不是两个>符号,而模板中,是以<为开始符,>为终结符,因此上面的定义中,编译器无法读到>终结符,导至误
不能直接用vec初始化list,也不能直接用list初始化vec,queue也一样。但是可以通过迭代器指定一个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类似,不能插入两个一样的值