关于c++顺序容器小结(二)---基本操作

各个容器都包含在自己的头文件中
构造:V v1;
V v2(v1);
V v1={a,b,c,d….};
操作(所有容器的基本操作):
v1.size();返回容器大小;
swap(v1,v2)交换容器元素//仅当元素类型一致是才可交换
v1.swap(v2);交换v1,v2的元素;
v1.max_size();返回容器可保存的最大元素数目;
v1.empty();判断容器是否为空;
v1.insert(args);想容器中插入元素;
v1.emplace(inits);使用inits构造c中的一个元素;
v1.erase(args); 删除指定的args元素;
v1.clear();删除容器内所有元素;
关系 运算符:
==;!=;
<,>,<=,>=;
迭代器:
v1.begin(),v1.end() 返回首位元素后的迭代器;
v1.cbegin(),v1.cend() 返回const_iterrator;
容器的拷贝:
一:直接拷贝;
二:拷贝另一个容器迭代器指定范围内的元素;

    list<string> v1 ={"first","second","thrid"};//列表初始化
    vector<const char *>v1={"a","b","c"};

    list<string>list2(v1);//正确,类型匹配
    deque<string>list1(v1);//错误 容器类型不匹配
    forward_list<string>v(v1.begin(),v1.end())//正确,虽然类型不匹配但是const char* 元素可以转换为string

添加元素:
push_back:

vector<string>V;
string word;
while(cin>> word){
    V.push_back(word);
}

//在string的末尾添加字符
void fun(size_t count, string &word)
{
    if(count>1)
        word.push_back("kjsd");//等价于+='kjsd'
}
push_front///在容器头添加元素
list<int >ilist ;
for(size_t ix=0;ix!=4;ix++){
    ilist.push_front(ix);//每个元素将会被一次插入在容器开始位置
}
insert//在容器特定位置插入元素
    V.insert(V.begin(),"hello");//等价于V.push_front();
    V.insert(iter,"hello");//在迭代器iter前添加
    vector<string>v={"one","two","three"};
    V.insert(V.begin(),v.end-2,v.end());//将v的嘴壶两个元素添加到V的开始位置
    list<string>lst;
    auto iter=lst.begin();
    while(cin>>word)
        iter=list.insert(iter.word);//用insert的返回值在特定位置插入元素
访问元素:
    if(!lst.empty()){
        auto val=lst.degin();
        while(val!=lst.end()){
            cout<<*val<<endl;
            val++;
        }   
    }
    删除元素:相对于插入的push_front和push_back,删除就是pop_front和pop_back;
    while(!lst.empty()){
        fun(lst.front());//处理元素
        lst.pop_fornt();//处理完后删除首元素,pop_back同理
    }
    如果从内部 啥暗处星对与insert的函数是erase
        list<int>bob{1,2,3,4,5,6,7};
        auto it=bob.begin();
        while(it!=bob.end()){
            if(*it%2){
                it=bob.erase(it);///删除奇数元素
            }
        }

特殊的forward_list操作:
当添加或删除元素时,之前的袁术的后继会发生改变,需要访问前去是需要改变前驱的连接,但是forward_list是单向链表没有获取其前驱的方法,所以在forward__list中是通过改变给定元素后的元素来完成的;
在forward_list中没有定义insert,emplace和erase,而是定义了insert_after,emplace_after和erase_after。

forward_list<int >flast={1,2,3,4,5};
auto prev=flast.before_begin();
auto cuur=flast.begin();
while(curr!=flast.end()){
    if(*curr%2)
        curr=flast.erase_after(prev);
    else{
        prev=curr;
        curr++;
    }
}

改变容器大小:
v.resize(n)来增大或减小容器的大小;若n小于v.size()则多出的元素被丢弃
容器的操作可能是迭代器失效:
*vector和string中如果内存被重新分配则迭代器、指针和引用都会失效,如果未重新分配内存,则插入如元素之前的迭代器,指针,引用都有效,后面的都失效
*deque在首尾之外插入都会导致失效,若果在收尾添加则不会失效
*对于list、forward_list无影响
**当我们啥暗处元素时尾后迭代器都会失效
vector的增长
为了支持随机访问,vector将元素紧挨着存放,通常会按预留一些空间来保存更多的新元素,这样就不会因为每次添加新元素都重新分配内存了,同时也提高了效率。
管理容量的成员函数:
v.shrink_to_fit();//将容量减少为何何size同样的大小,只适用于vector、string和deque;
v.capacity();//不重新分配内存的话能保存的最大元素数;
v.reserve(n);//分配至少能存n个元素的空间
string的其他方法:
append()和replace():
append是在尾部追加字符串,replace可以在任意指定位置删除或添加指定长度的字符串
append(”djsdn”);//在尾部添加djsdn
replace(11,3,”dsss”);//从11位置开始删除三个元素并插入新字符
搜索操作:
s.find(args); 查找s中args第一次出现的位置
s.rfind(args); 查找s中args最后一次出现的位置
s.find_first_of(args); 在s中查找args中任何一个字符第一次出现的位置
s.find_last_of(args); 在s中查找args任何一个字符最后出现的位置
s.find_first_not_of(args); 在s中查找第一个不在args中的字符
s.find_last_not_of(args);在s中查找最后一个不在 args中的字符
容器适配器:
stack(栈),queue(队列),priority_queue(优先队列)。

#include<stack>
deque<int> deq;
stack<int>sk(deq);//从deq拷贝元素到sk;
for(size_t ix=0; ix!=10;ix++){
    sk.push(ix);//元素入栈
}
while(!sk.empty()){
    int value=sk.top();///使用栈顶元素
    sk.pop();//栈顶元素出栈,循环继续
}
stack<int> s;//定义空栈s

#include<queue>///包含queue和priority_queue
queue<int>q;
q.pop();//返回queue中队首元素或priority_queue中优先级高的元素,**并删除**
q.front();//返回手元素或尾元素,不删除
q.top();//只适用于priority_queue
q.back();//只适用于queue
q.push(item);在队尾或priority_queue恰当位置添加元素
q.emplace(args);//其值为item或者由args构造
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值