C++容器类型内置函数随笔
vector 容器
添加数据 vector <int> v ; v.push_back(数据);
访问数据的两个迭代器b.begin()和v.end()
vector <int> :: iterator it_begin = v. begin(); //容器起始位置元素的指针
vector <int> :: iterator it_end =v.end(); //指向容器最后一个元素下一个位置的指针
while (it_begin != it_end){
cout<< *it_begin<<endl;
it_begin++;
}
另外一种遍历方式:
for (vector <int> :: iterator it = v.begin() ; it != v.end() ; it++)
{
cout <<*it <<endl;
}
打印vector 元素的函数:
void printvec (vector <int> &v ){
for (vector <int> :: iterator it = v.begin() ; it != v.end() ; it++)
{
cout <<*it <<endl;
}
}
vector 相似于数组,但是数组是静态空间,vector是动态扩展
动态扩展:
并不是在原空间之后续接新空间,而是找更大的内存空间,然后将原数据拷贝新空间,释放原空间
vector称之为单端数组,如下图:
无参构造:
vector <int > v ;
有参构造:
vector <int > v2 (v1.begin(),v1.end()); //直接赋值迭代器中间的数据
n个elem方式:
vector <int> v3 (10,100); //10个100
拷贝构造:
vector <int > v4(v);
vector 容量和大小:
判断是否为空 v1.empty()
输出容量v1.capacity() 一般是有空余,比如创建vector空间是13,但是只插入了10个数
输出大小 v1.size() // 按照上述,容量是13,大小是10
重新指定大小v1.resize (20 , x) ; //若过长,则默认使用x值填充 ,若不指定x值,默认为0
若比原来的短,超出的部分删去
插入删除:push_back / pop_back
push_back在尾部添加
pop_back在尾部删除
insert指定位置插入 v1.insert(v1.begin() ,100) //在头部插入100
insert指定位置插入 v1.insert(v1.begin() ,2,1000) //在头部插入2个1000
v1.erase(v1.begin()) ;删除一个头部元素
v1.erase(v1.begin(),v1.end()) ;从头到尾全部删除 等于v1.clear();
at访问元素:
v1.at(i) 等同于 v1[i]
获取整个数组的第一个元素: v1.front() ; 最后一个元素: v1.back()
元素互换 swap():
vector<int > v1;
for (int i = 0 ; i< 10; i++){
v1.push_back (i );
}
vector<int > v2;
for (int i = 10 ; i>0; i--){
v2.push_back (i );
}
v1.swap(v2); //实现v1与v2内容互换
用于收缩内存空间:
上述代码输出:
防止空间冗余
string容器
string 的构造函数(下列分别对应默认构造、有参构造、拷贝构造):
注意:有参构造需要传入指向const的指针变量
字符串拼接:
直接str += "需要拼接的字符";
或者str.append(” 需要拼接的字符“)
或者需要限制拼接的字符的长度:
str3.append( "LOL_APEX",3); //第二个参数是长度,即拼接了LOL
str3.append("LOL_APEX!",4,5); //从第4个参数开始截取,取5个长度即:APEX!
查找 :find
int pos = str1.find("abc");//返回第一次出现字符的位置,若没找到返回-1
int pos1= str1.rfind ("abc"); //该函数从右往左查找, 但是下标位置还是从左往右计算
替换:replace
string str1 = "abcdefg";
str1.replace(1,3,"1111");
返回结果a1111efg ,会把指定的字符全替换进去,而不是依据1到3的长度
字符串比较:compare
字符串比较是按字符的ASCII码进行对比
str1.compare(str2)
=返回 0
>返回 1 //第一个字符大于第二个字符
<返回 -1
string字符串存取:
访问单个字符:at
for (int i = 0 ;i < str.size() ;i++){
cout <<str.at(i)<<" "; //等同于 cout <<str[i]<<" ";
}
修改单个字符也可以用at()
删除:delete 插入:insert
string str = "hello";
str1.insert (1,"111") ; //在位置为1处插入
最后输出h111ello
str.erase (1,3); //从位置1删到位置3
输出hello
截取子串substr:
string str1 = "abcdef";
string subs1 = str1.substr (1,3);
输出sub1 为bcd
实用场景比如截取邮件的@前用户名
拷贝: copy
Deque 容器
相比于vector ,deque是双端数据,可以对头端进行插入删除操作
vector对头部的插入删除效率低,操作头部速度慢,但是访问元素的速度要比deque快
// 构造函数
deque <int > d1;
for (int i = 0; i<10 ; i++ )
{
d1.push_back(i) ;
}
deque <int > d2 (d1.begin() , d1.end());
deque <int> d3 (10,100) ; //10个100
deque<int > d4 (d1);
//赋值函数
deque <int > d5;
d5= d1;
deque <int > d6;
d6.assign(d1.begin() , d1.end());
判断是否为空 deque.empty()
判断元素个数 deque.size()
注意:Deque中没有查询容量的函数,没有容量的概念
重新指定大小 d1. resize (15,100) ; 超出部分使用100代替,不指定为0
首端与尾端插入和删除:
d1.push_back(10); //尾插
d1.push_back(20);
d1.push_front(100); //头插
d1.push_front(200);
/// 此时输出200 100 10 20
d1.pop_back() ; 尾删
d1.pop _front() ; 头删
d1. insert("插入位置" ,“插入内容”);
d1. insert("插入位置" ,插入数量,“插入内容”);
删除 : d1. erase("位置")
如删除1位置的元素
deque <int > ::iterate it = d1.begin();
i++;
d1.erase(it);
全部清空:
d1.clear();
元素访问:
使用[ ] 和at ,使用front返回第一个元素,使用back返回最后一个元素