STL学习(multiset Vector)

Vector比数组好用多了,毕竟是可变长的.

常用来建图.

需要掌握的就是构造函数,添加数据,删除数据.

#include<set>
#include<ctime>
#include<cmath>
#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
#define maxn 1100000
using namespace std;

int main(){
    srand(time(NULL));
    vector<int> v1; ///empty
    vector<int> v2(5);///5 elements
    vector<int> v3(5,1);///5 elements all is 1
    vector<vector<int> >v4;/// two axis with empty
    vector<vector<int> >v5[5]; /// int a[5][] col is empty
    vector<vector<int> >v6(8,vector<int>(5,0)); /// int a[8][5] all is 0
    /**==================================================================**/
    printf("v1‘s size is %d\n",v1.size());
    for(int i = 0;i<10;i++)
        v1.push_back(rand()),printf("%d ",*v1.rbegin());puts("");///insert

    printf("v1‘s size is %d\n",v1.size());

    for(int i = 0;i<10;i++)
        printf("%d ",v1[i]);puts("");///visit
    sort(v1.begin(),v1.end(),less<int>());
    printf("having been sorted:\n");
    for(int i = 0;i<10;i++)
        printf("%d ",v1[i]);puts("");
    while(v1.size())
        v1.erase(v1.begin());
    printf("\nv1‘s size is %d\n",v1.size());///erase
    for(int i = 0;i<5;i++){
        v4.push_back(vector<int>(5));
        for(int j = 0;j<5;j++)
            v4[i].push_back(rand());
    }
   return 0;
}

void test_vector_constructor()
{
    // 0. Create an empty vector v0
    std::vector<int> v0;
    assert(v0.empty());

    // 1. Create a vector v1 with 3 elements of default value 0
    std::vector<int> v1(3);

    // 2. Create a vector v2 with 5 elements of value 2
    std::vector<int> v2(5, 2);

    // 3. Create a vector v3 with 3 elements of value 1 and with the allocator of vector v2
    std::vector<int> v3(3, 1, v2.get_allocator());

    // 4. Create a copy, vector v4, of vector v2
    std::vector<int> v4(v2);

    // 5. Create a vector v5 by copying the range v4[_First, _Last)
    std::vector<int> v5(v4.begin() + 1, v4.begin() + 3);

    std::cout << "v1 = ";
    std::copy(v1.begin(), v1.end(), std::ostream_iterator<int>(std::cout, " "));
    std::cout << std::endl;

    std::cout << "v2 = ";
    std::copy(v2.begin(), v2.end(), std::ostream_iterator<int>(std::cout, " "));
    std::cout << std::endl;

    std::cout << "v3 = ";
    std::copy(v3.begin(), v3.end(), std::ostream_iterator<int>(std::cout, " "));
    std::cout << std::endl;

    std::cout << "v4 = ";
    std::copy(v4.begin(), v4.end(), std::ostream_iterator<int>(std::cout, " "));
    std::cout << std::endl;

    std::cout << "v5 = ";
    std::copy(v5.begin(), v5.end(), std::ostream_iterator<int>(std::cout, " "));
    std::cout << std::endl;

    // Move vector v2 to vector v6
    std::vector<int> v6(move(v2));

    std::cout << "v6 = ";
    std::copy(v6.begin(), v6.end(), std::ostream_iterator<int>(std::cout, " "));
    std::cout << std::endl;
};

multiset 就是可以存放多个相同的元素.就是在删除的时候如果删除元素则删除的是所有元素,如果一个个删除要用迭代器去删除.

ACM中常用来做为二叉树的备用品.查找使用upper_bound和lower_bound这两个函数.

erase删除有两种方法,一种查找到你要的,st.erase(iterator),st.(item)///这种删掉所有该元素

#include<set>
#include<ctime>
#include<cmath>
#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
#define maxn 1100000
using namespace std;
int a[10];
int main(){
    srand(time(NULL));
    multiset<int,less<int> > st;///注意不同,less 升序(默认)
    sort(a,a+10,less<int>() );///
    for(int i = 0;i<8;i++){
        a[i] = rand();
        st.insert(a[i]);
        printf("%d ",a[i]);
    }puts("");
    a[9]=a[3];a[8]=a[6];st.insert(a[9]);st.insert(a[8]);
    for(auto it = st.begin();it!=st.end();it++)
        printf("%d ",*it);puts("");
    auto it = st.lower_bound(a[3]);
    st.erase(it);
    for(auto it = st.begin();it!=st.end();it++)
        printf("%d ",*it);

    return 0;
}
时间: 2024-08-29 09:16:58

STL学习(multiset Vector)的相关文章

STL学习之vector

vector是一个线性顺序结构.相当于数组,但其大小可以不预先指定,并且自动扩展.它可以像指针一样被操作,由于它的特性我们完全可以将vector看做动态数组. 特点: 1.指定一块如同数组一样的连续存储,但空间可以动态扩展.即它可以像数组一样操作,并且可以动态操作. 2.随机访问方便,它像数组一样被访问. 3.节省空间,因为它是连续存储,在存储的区域是没有被浪费的,当然未存储的区域实际是浪费的. 4.在内部插入删除效率非常低,这样的操作基本是被禁止的.vector被设计成只能在后端进行追加和删除

标准模板库(STL)学习探究之vector容器

标准模板库(STL)学习探究之vector容器  C++ Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据.为了可以使用vector,必须在你的头文件中包含下面的代码:#include <vector>构造函数. Vectors 包含着一系列连续存储的元素,其行为和数组类

STL学习——Vector篇

STL学习--Vector篇 vector简介 vector的数据安排及操作方式与array非常相似,两者的区别在于空间运用的灵活性.array是静态空间,一旦配置了,就不能改变:要换个大(或小)一点的可以,但琐碎的事由客户端完成:首先配置一块新空间,然后将元素从旧址一一搬往新址,再把原来的空间释还给系统.而vector是动态空间,随着元素的加入,它的内部机制会自动扩充空间以容纳新元素.它对内存的合理利用和灵活运用有很大的帮助. vector实现关键技术:对大小的控制以及重新配置时的数据移动效率

STL学习_配接器篇

STL学习_配接器篇 定义 配接器(Adapter)在STL组件的灵活组合运用功能上,扮演着轴承.转换器的角色.它事实上是一种设计模式.即将一个class的接口转换为另一个class的接口,使原本因接口不兼容而不能合作的classes,可以一起运作. 分类 STL所提供的各种适配器中,改变仿函数(functors)接口者,称为function adapter:改变容器(containers)接口者,称为container adapter:改变迭代器(iterators)接口者,称为iterato

【STL学习】智能指针之shared_ptr

前面已经学习过auto_ptr,这里补充另外一种智能指针,比auto_ptr要更强力更通用的shared_ptr. shared_ptr 简介及使用选择  几乎所有的程序都需要某种形式的引用计数智能指针,这种指针让我们不再需要为两个对象或更多对象共享的对象的生命周期而编写复杂的逻辑(写起来有点绕口),当被共享的对象引用计数降为0时,被共享对象被自动析构. 引用计数指针分为插入式(instrusive)和非插入式(non-instrusive)两种.前者要求它所管理的类提供明确的函数或数据成员用于

STL学习——Priority_queue篇

STL学习--Priority_queue篇 概述 priority_queue是一个拥有权值观念的queue,它允许加入新元素,移除旧元素,审视元素值等功能.因为它是queue,故只允许底端加入元素,顶端取出元素.priorit_queue内元素并非依照被推入的次序排列,而是依照元素权值排列.权值最高者,排在最前面. 实现 priority_queue利用max_heap和vector表现的完全二叉树实现.它的实现完全以底部容器为根据,并使用heap处理规则,故实现简单.默认情况,使用vect

stl学习记录

Effective STL 中文版学习记录 条款4 判断容器是否为空 使用empty而不是size().size()操作在实现上不是一个时间常数操作条款5 尽量使用区间成员函数代替它们的单元素兄弟.STL实现中,区间范围显示比单个循环操作更优化 条款7:当使用new得指针的容器时,记得在销毁容器前delete那些指针vc2008下 运行代码 可以看到 该程序内存不断增加// 1111111.cpp : 定义控制台应用程序的入口点.// #include "stdafx.h" #incl

STL学习_List篇

STL学习--List篇 简介 List与Vector不同,它不使用连续空间,而是每次插入或删除一个元素,就配置或释放一个元素空间.故list对空间的使用精准,不浪费任何空间.list对任何位置的元素插入或删除,常数时间完成. List与Vector的使用,视元素的多少,元素的构造复杂度,元素存取行为的特性而定. List节点 List本身与List节点不同,List是一个双向的链表.其节点信息如下: struct _List_node_base { _List_node_base* _M_ne

STL学习——Deque篇

STL学习--Deque篇 deque概述 deque是一种双向开口的连续线性空间.双向开口指可以在头尾两端分别做元素的插入和删除操作.虽然vector也可以在头尾两端进行操作,但是其头部操作效率极差,无法被接受. deque与vector最大差异:1)deque允许于常数时间内对起头端进行元素的插入或移除操作:2)deque没有所谓的容量概念,因为它是动态地以分段连续空间组合而成,随时可以增加一段新的空间并连接起来.deque不提供所谓的空间保留功能,不存在重新配置,移动数据,释放原空间操作.