C++primer学习:顺序容器(3)

[1]forward_list和其他顺序容器不同,它有一些特殊的操作.因为改变一个链表中的元素必须改变它的前驱的状态,因此相应的操作是Insert_after(p,t)/(p,n,t)/(p,b,e)在p之后添加元素t/n个t/迭代器b,e(不包括e)之间的元素,erase_after(it)/(b,e)意思是删除/添加it之后的元素.

练习:删除一个forward_list中的奇数

    using L = forward_list<int>;
    L vec{ 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    for (auto cur = vec.begin(), pre = vec.before_begin(); cur != vec.end();)
    {
        if (*cur % 2)
            cur = vec.erase_after(pre);//返回被删除元素之后的迭代器
        else
            pre = cur++;//检测下一个
    }

练习:在forward_list〈string〉obj中寻s1,然后将s2插入到s1后面;如果找不到s1,就把s2插入尾部.

void Insert(L& obj, const string &s1, const string &s2)
{
    auto cur = obj.begin(),pre = obj.before_begin();
    for (; cur != obj.end();pre = cur++)
    {
                if (*cur == s1)
        {
            obj.insert_after(cur, s2);
            return;
        }
    }
    obj.insert_after(pre, s2);
}

练习:删除奇数元素复制偶数元素.注意,本题如果采用数据类型是list,要将指针向前移动两个,但是该容器不支持iter+=2的形式的运算.可以用advance(iter,2)来代替.

int main()
{
    forward_list<int> L1{ 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    for (auto pre = L1.before_begin(), cur = L1.begin(); cur != L1.end();)
    {
        if (*cur % 2)
        {
            cur = L1.insert_after(cur, *cur);
            pre = cur++;
        }
        else
            cur =L1.erase_after(pre);
    }
    return 0;
}

[2]重新分配内存会使得指针,迭代器,引用失效,当在一个满的容器中插入一个新元素,会使得容器重新分配内存.

     vector<int> v(100);//不会重新分配内存,因为足够大
    v = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    auto begin = v.begin();
    while (begin != v.end()) 
    {
        ++begin;
        /*begin = */ v.insert(begin, 42);//不重新给迭代器赋值
        ++begin;
    }

你可能感兴趣的:(C++primer学习:顺序容器(3))