顺序容器

#include<list>
#include<vector>
#include<string>
#include<queue>
#include<forward_list>
#include<iostream>
#include<array>
int main() {
    using namespace std;
    list<string>authors = { "Miltor","Shakepsare","Austen" };
    vector<const char*>artices = { "a","an","the" };
    list<string> list2(authors);
    forward_list<string> wordes(artices.begin(), artices.end());

    vector <int>ivec(10, -1);

    array<int, 10>aval;//10个默认初始化的int 
    for (auto s : aval) {
        cout << s <<endl;
    }
    system("pause");
    return 0;

};

赋值和swap

c1=c2; //将c1的内容替换为c2的拷贝
c1={a,b,c};//赋值后,c1的大小为3

array<int,6>a1={0,1,2,3,4,5};
array<int,10>a2={0};所有元素均为0;
a1=a2;//替换a1元素
a2={0}//error 不能将一个花括号列表赋予数组

使用assign(仅顺序容器)


    list<string>names;
    vector<const char*>oldstyle;
    //将names中的元素替换为指定范围中的元素的拷贝.assign的参数决定了容器中有多少个元素以及他们的值什么
    names.assign(oldstyle.cbegin(), oldstyle.cend());
    system("pause");

    list<string>slist1(1);
    slist1.assign(10, "maya");//10个元素,每个都maya

使用swap

vector<string>svec1(10);
    vector<string>svect2(20);
    cout << "交换前: svec1 --" << svec1.size() << " svec2 --" << svect2.size() << endl;
    swap(svec1, svect2);
    cout << "交换后: svec1 --" << svec1.size() << " svec2 --" << svect2.size() << endl;
    system("pause");

output:
交换前: svec1 --10 svec2 --20
交换后: svec1 --20 svec2 --10

顺序容器操作

向顺序容器添加元素的操作
这些操作会改变容器大小,array不支持这些操作
forward_list 有自己 insert和empleace
forward_list 不支持push_back和emplace_back
vector和string不支持push_front和emplace_front
c.push_back(T) 在c的尾部创建一个值为t或由argsc创建的元素返回void
c.emplace_back(args)
c.push_front(t) 在c的头部创建一个值为t或由argsc创建的元素返回void
c.emplace_front(args)
c.insert(p,t) 在迭代器p指向的元素之前创建一个值为t或由args创建的元素,返回指向新添加的第一个元素的迭代器;或n为0,则返回p
c.insert(p,b,e) 将迭代器b和e指定的范围内插入到迭代器p指向的元素之前.b和e不能指向c中的元素.返回指向新添加的第一个元素的迭代器;若范围为空,返回p
c.insert(p,il) li是一个花括号包围的元素之列表,将这些给定值插入到迭代器p指向的元素之前,返回指向新添加第一个元素的迭代器,若列表为空,则返回p

emplace_back() 和 push_back 的区别
通常使用push_back()向容器中加入一个右值元素(临时对象)的时候,首先会调用构造函数构造这个临时对象,然后需要调用拷贝构造函数将这个临时对象放入容器中。原来的临时变量释放。这样造成的问题是临时变量申请的资源就浪费

emplace_back 在容器尾部添加一个元素,这个元素原地构造,不需要触发拷贝构造和转移构造。而且调用形式更加简洁,直接根据参数初始化临时对象的成员


顺序容器的删除操作

这些操作会改变容器大小,所以不适用array
forward_list有特殊版本的erase
forward_list不支持pop-back;vector和string不支持pop_front.
c.pop_back() 删除尾元素
c.pop_front() 删除首元素
c.erase(p) 删除指定元素,返回删除元素之后的迭代器
c.erase(b,e)删除范围内的元素,返回删除元素之后的迭代器
c.clear() 删除所有元素

forward_list中插入删除元素操作
lst.before_begin()      返回指向链表首元素之前并不存在的元素的迭代器,此迭代器不能解引用。
lst.cbefore_begin()      cbefore_begin()返回一个const_iterator
lst.insert_after(p,t)      在迭代器p之后的位置插入元素。t是一个对象,n是数量,b和e是表示范围的一对迭代器(b和e不能指向lst内),il是一个花括号列表。返回一个指向最后一个插入lst.insert_after(p,n,t)  返回指向最后一个插入元素的迭代器。如果范围为空,则返回p,若p为尾后迭代器,则函数行为未定义。
lst.insert_after(p,b,e)
lst.insert_after(p,il)
emplace_after(p,args)    使用args在p指定的位置之后创建一个元素,返回一个指向这个新元素的迭代器。若p为尾后迭代器,则函数的行为未定义
lst.erase_after(p)       删除p指向的位置之后的元素,或删除从b之后直到(但不包含)e之间的元素。返回一个指向被删除元素之后元素的迭代器,若不存在这样的元素,则返回尾后迭代器,如果p指向lst的尾元素或者是一个尾后迭代器,则函数的行为未定义

猜你喜欢

转载自blog.csdn.net/gameloftnet/article/details/79260528
今日推荐