Sword STL容器分类介绍

标准STL序列容器:vector、string、deque和list。
标准STL关联容器:set、multiset、map和multimap。
非标准序列容器slist和rope。slist是一个单向链表,rope本质上是一个重型字符串
非标准关联容器hash_set、hash_multiset、hash_map和hash_multimap。

标准STL容器提供了四种不同的迭代器:iterator、 const_iterator、reverse_iterator和const_reverse_iterator。

每个标准容器类都提供四种迭代器类型。
对于container<T>而言,iterator的作用相当于T*,
而const_iterator则相当于const T*(你可能也见过T const*这样的写法:它们意思一样的)。
增加一个iterator或 者const_iterator可以在一个从容器开头趋向尾部的遍历中让你移动到容器的下一个元素。
reverse_iterator与 const_reverse_iterator同样相当于对应的T*和const T*,
所不同的是,增加reverse_iterator或者 const_reverse_iterator会在从尾到头的遍历中让你移动到容器的下一个元素。
/* 序列容器删除 */
#include <iostream>
#include <string.h>
#include <vector>
#include <list>
#include <map>
#include <time.h>
#include <algorithm> //remove_if头文件

using namespace std;

bool badValue1(int x)
{
    return (4 == x ? true : false);
}

bool badValue2(int x)
{
    return (3 == x ? true : false);
}

void printNum(int x)
{
    cout << x << endl;
}

void test()
{
    vector<int> v1 = { 1,2,3,4,5,6,7,8 };

    //删除vector、string、deque指定元素的方法
    v1.erase(remove_if(v1.begin(), v1.end(), badValue1));
    for_each(v1.begin(), v1.end(), printNum);

    //删除vector、string、deque过程中如果需要做特别操作,那么必须循环遍历使用erase方法删除
    vector<int>::iterator it;
    for (it = v1.begin(); it != v1.end();)
    {
        //注意序列容器的删除用法
        if (badValue2(*it))
        {
            cout << "i am erase ." << *it << endl;
            it = v1.erase(it);
        }
        else
        {
            it++;//这里使用前置++和后置+=没区别
        }
    }

    for_each(v1.begin(), v1.end(), printNum);

}

int main()
{
    test();
    getchar();
    return 0;
}
/* 关联容器删除 */
#include <iostream>
#include <string>
#include <vector>
#include <list>
#include <map>
#include <time.h>
#include <algorithm> //remove_if头文件

using namespace std;

void test()
{
    map<int, string> m1;
    m1.insert(make_pair(0, "a"));
    m1.insert(make_pair(1, "b"));
    m1.insert(make_pair(2, "c"));
    m1.insert(make_pair(3, "d"));
    m1.insert(make_pair(4, "e"));
    m1.insert(make_pair(5, "f"));

    //删除set、multiset、map和multimap指定元素的方法,关联容器没有remove方法,只能遍历删除
    map<int, string>::iterator it;

    for (it = m1.begin(); it != m1.end(); /*递增条件为空*/)
    {
        if ("a" == it->second)
        {
            m1.erase(it++);//注意这里使用后置++,表示先取得后面的迭代器,返回当前迭代器给earse方法
        }
        else
        {
            it++;
        }
    }

    for (it = m1.begin(); it != m1.end(); ++it)
    {
        cout << it->second << endl;
    }

}

int main()
{
    test();
    getchar();
    return 0;
}
为了避免你奇怪list的适当方法是什么,事实表明对于迭代和删除,你可以像vector/string/deque一样或像关联 容器一样对待list;两种方法都可以为list工作
总结:几乎所有的容器都在同名的头文件里,比如,vector在<vector>中声明,list在<list>中声明等。例外的 是<set>和<map>。<set>声明了set和multiset,<map>声明了map和multimap。
除了四个算法外,所有的算法都在<algorithm>中声明。例外的是accumulate(参见条款37)、 inner_product、adjacent_difference和partial_sum。这些算法在<numeric>中声明。
特殊的迭代器,包括istream_iterators和istreambuf_iterator,在<iterator>中声明。
标准仿函数(比如less<T>)和仿函数适配器(比如not1、bind2nd)在<functional>中声明

原文地址:https://www.cnblogs.com/zhanggaofeng/p/9880417.html

时间: 2024-10-15 07:41:12

Sword STL容器分类介绍的相关文章

STL - STL容器的适用情况

原文地址:http://hsw625728.blog.163.com/blog/static/3957072820091116114655254/ 一.各种容器的特性 vector 典型的序列容器,C++标准严格要求次容器的实现内存必须是连续的,唯一可以和标准C兼容的stl容器,任意元素的读取.修改具有常数时间复杂度,在序列尾部进行插入.删除是常数时间复杂度,但在序列的头部插入.删除的时间复杂度是O(n),可以 在任何位置插入新元素,有随机访问功能,插入删除操作需要考虑. deque 序列容器,

STL容器的适用情况

转自http://hsw625728.blog.163.com/blog/static/3957072820091116114655254/ ly; mso-default-props:yes; mso-bidi-font-family:"times new roman"; mso-bidi-theme-font:minor-bidi;} @page {mso-page-border-surround-header:no; mso-page-border-surround-footer

C++STL容器和迭代器

1.简介 容器(container)用于存放数据的类模板.可变长数组.链表.平衡二叉树等数据结构在 STL 中都被实现为容器.程序员使用容器时,就是将容器类模板实例化为容器类,需要指明容器中存放的元素是什么类型的. 容器中可以存放基本类型的变量,也可以存放对象.对象或基本类型的变量被插入容器中时,实际插入的是对象或变量的一个复制品. 1.1 容器分类 容器分为2类:顺序容器和关联容器 顺序容器:可变长动态数组 vector.双端队列 deque.双向链表 list.之所以被称为顺序容器,是因为元

STL容器——对map排序

STL容器(三)——对map排序 对于map的排序问题,主要分为两部分:根据key排序:根据value排序.下面我们就分别说一下~ 1. 根据key进行排序 map默认按照key进行升序排序 ,和输入的顺序无关.如果是int/double等数值型为key,那么就按照大小排列:如果是string类型,那么就按照字符串的字典序进行排列~ (还记得之前说过的字典序吗?当时我们用到了next_permutation这个库函数!)下面我们展示一个例子,说明map中默认按照key升序排列 的情况. Exam

STL vector的介绍(1)

尝试下翻译STL里面的一些容易和算法.四级过了,六级刚考.顺便练练自己的英语水平,翻译的不好的地方请大神多多指教哈,方便我改正. 原来均来自:http://www.cplusplus.com/ template < class T, class Alloc = allocator<T> > class vector; // generic template Vector Vectors are sequence containers representing arrays that

STL容器的内存分配

这篇文章参考的是侯捷的<STL源码剖析>,所以主要介绍的是SGI STL实现版本,这个版本也是g++自带的版本,另外有J.Plauger实现版本对应的是cl自带的版本,他们都是基于HP实现的版本,有兴趣可以翻翻最新的源码头文件开始处有声明. /* * * Copyright (c) 1994 * Hewlett-Packard Company(这里) * * Permission to use, copy, modify, distribute and sell this software *

STL容器(三)——对map排序

STL容器(三)--对map排序 对于map的排序问题,主要分为两部分:根据key排序:根据value排序.下面我们就分别说一下~ 1. 根据key进行排序 map默认按照key进行升序排序,和输入的顺序无关.如果是int/double等数值型为key,那么就按照大小排列:如果是string类型,那么就按照字符串的字典序进行排列~(还记得之前说过的字典序吗?当时我们用到了next_permutation这个库函数!)下面我们展示一个例子,说明map中默认按照key升序排列的情况. Example

STL容器 vector,list,deque 性能比较

C++的STL模板库中提供了3种容器类:vector,list,deque对于这三种容器,在觉得好用的同时,经常会让我们困惑应该选择哪一种来实现我们的逻辑.在少量数据操作的程序中随便哪一种用起来感觉差别并不是很大,但是当数据达到一定数量后,会明显感觉性能上有很大差异. 本文就试图从介绍,以及性能比较两个方面来讨论这个问题. vector - 会自动增长的数组 list - 擅长插入删除的链表 deque - 拥有vector和list两者优点的双端队列 性能竞技场 性能总结与使用建议 测试程序清

如何选择STL容器中对象的删除方法

备注:唯一从容器中除去一个元素的方法是在那个容器上调用一个成员函数. 以下介绍删除不同类型的容器中满足某种条件的值的方法,某种条件指的是 bool badValue(int value)返回true的情况. 1.序列容器 for(SeqContainer<int>::iterator i = c.begin(); i != c.end(); /*nothing*/) { if(badValue(*i)) { //something to do i = c.erase(i); } else ++