美文网首页
C++ 容器浅析

C++ 容器浅析

作者: ZoranLee | 来源:发表于2021-03-29 18:30 被阅读0次
  • vector
  • stack
  • queue
  • list
  • set

vector

  • 向量(Vector)是一个动态大小数组的顺序容器(Sequence Container)。【元素按线性顺序排序,通过元素在序列中的位置访问对应的元素。】
  • 能够存放任意类型的动态数组。
  • 可以通过指针进行该操作,有在序列末尾相对快速地添加/删除元素的操作
  • 用一个内存分配器对象来动态地处理它的存储需求。

函数

  • 构造函数

vector():创建一个空vector

vector(int nSize):创建一个vector,元素个数为nSize

vector(int nSize,const t& t):创建一个vector,元素个数为nSize,且值均为t

vector(const vector&):复制构造函数

vector(begin,end):复制[begin,end)区间内另一个数组的元素到vector中

  • 增加函数
void push_back(const T& x):向量尾部增加一个元素X

iterator insert(iterator it,const T& x):向量中迭代器指向元素前增加一个元素x

iterator insert(iterator it,int n,const T& x):向量中迭代器指向元素前增加n个相同的元素x

iterator insert(iterator it,const_iterator first,const_iterator last):向量中迭代器指向元素前插入另一个相同类型向量的[first,last)间的数据

  • 删除函数
iterator erase(iterator it):删除向量中迭代器指向元素

iterator erase(iterator first,iterator last):删除向量中[first,last)中元素

void pop_back():删除向量中最后一个元素

void clear():清空向量中所有元素

  • 遍历函数

reference at(int pos):返回pos位置元素的引用

reference front():返回首元素的引用

reference back():返回尾元素的引用

iterator begin():返回向量头指针,指向第一个元素

iterator end():返回向量尾指针,指向向量最后一个元素的下一个位置

reverse_iterator rbegin():反向迭代器,指向最后一个元素

reverse_iterator rend():反向迭代器,指向第一个元素之前的位置

  • 示例
int main(){
    vector<int> vector12;//初始化
    vector12.insert(vector12.begin(), 10);//前面插入
    vector12.insert(vector12.begin(), 20);
    vector12.insert(vector12.begin(), 30);
    vector12.insert(vector12.end(), 40);//后面插入

  //遍历
  for (int i = 0; i < vector12.size(); i++) {
        int value = vector12[i];
        cout << value << endl;
    }  

vector12.front() = 1;//修改front和back的值
vector12.back() = 2;//修改front和end的值

vector12.erase(vector12.begin() + 1);//擦除

  //迭代器遍历
    for (auto iter = vector12.begin(); iter != vector12.end(); iter++) {
        // 迭代器 当中指针操作  iteratorVar++
        cout<<*iter<<endl;
    }  


}

stack

  • 栈是一种容器适配器
  • LIFO
 #include <stack>  
//Initializing an Adapator;初始化
stack<int> stk(deq); // copies elements from deq into stk

//覆盖基础容器类型
 stack< string, vector<string> > str_stk;

//函数
s.empty() //Returns TRue if the stack is empty; false otherwise.



s.size()//Returns a count of the number of elements on the stack.



s.pop()//Removes, but does not return, the top element from the stack.



s.top()//Returns, but does not remove, the top element on the stack.



s.push(item)//Places a new top element on the stack.



  • 示例

 stack<int> stackVar;
    stackVar.push(20);
    stackVar.push(40);
    stackVar.push(60);

    for (int i = 0; i < stackVar.size(); i++) {
//        cout << stackVar[i] << endl;//报错
    }

//    for(stack<int>::iterator iter;){//没有迭代器
//
//    }

//慎用
    while (!stackVar.empty()) {
        int ele = stackVar.top();
        cout << ele << endl;
        stackVar.pop();
    }
    //最后没有元素了
    cout << "元素:" << endl;
    int top = stackVar.top();
    cout << top << endl;
    //C++ stack 的栈是不能遍历的,需要遍历的话 可以换个容器比如list

queue

Class QueueItem will represent a node in Queue's linked list. This class has two data members: item and next:

  • item holds the value of the element in the Queue; its type varies with each instance of Queue.
  • **next **is a pointer to the next QueueItem object in the queue.
image.png
  • 初始化方式和stack相同

  • 具有如下方法


    image.png
  • priority_queue

  queue<int> queueVar;

    queueVar.push(10);
    queueVar.push(20);

//    priority_queue<int> priority_queueVar; //默认从小到大顺序排列
//    priority_queue<int,vector<int>,less<>> priority_queueVar; //从小到大顺序排列
    priority_queue<int,vector<int>,greater<>> priority_queueVar; //从大到小顺序排列
    priority_queueVar.push(10);
    priority_queueVar.push(20);
    priority_queueVar.push(30);
    priority_queueVar.push(40);

//    for(int i = 0;i<priority_queueVar.size();i++){
//        priority_queueVar[i];
//    }

    // queue 不允许有遍历行为
    int top = priority_queueVar.top();
    cout<<top<<endl;

list

image.png image.png

set

int main(){
set<int, less<int>> setVar; //  __x < __y 从小到大,默认情况下 就是 less

    // 添加参数,不需要用迭代器,也不需要指定位置
    setVar.insert(1);
    setVar.insert(3);
    setVar.insert(2);
    setVar.insert(4);

    // 重复插入,并不会报错  std::pair<iterator, bool>
    pair<set<int, less<int>>::iterator, bool> res = setVar.insert(8);

    // res.first 获取第一个元素 迭代器   当前迭代器   最后一个位置
    // res.second 获取第二个元素 bool
    bool insert_success = res.second;
    if (insert_success) {
        cout << "恭喜你,插入成功" << endl;

        // 插入成功后,我用第一个元素遍历
        for (; res.first != setVar.end(); res.first ++) {
            cout << *res.first << endl;
        }

    } else {
        cout << "哎,插入失败.." << endl;
    }

    // 全部遍历  auto 自动推到
    for (auto it = setVar.begin(); it != setVar.end() ; it ++) {
        cout << *it << endl;
    }
}

谓词


// 谓词 设计对象的排序

#include <iostream>
#include <set>

using namespace std;

// set(内部:红黑树结构),会对你存入的数据自动进行排序,但是绝对不允许元素相同

class Person {
public:
    string name;
    int id;
    Person(string name, int id) : name(name), id(id) {}
};

// C++ 都是一些常规的 谓词  不能满足功能, 模仿C++源码的谓词 自定义谓词 解决这个问题

// C++缔造者写的这个源码 没有对象比较的功能 【系统源码谓词 做不到对象比较功能】
// bool operator()(const _Tp& __x, const _Tp& __y) const { return __x < __y; }

// 我们就自定义这个功能  【自定义谓词 没有达到谓词的标准】
bool doCompareAction(const Person& person1, const Person& person2) {
    return person1.id < person2.id;
};

// 真正的谓词
struct doCompareAction2 {
public:
    bool operator() (const Person& __x, const Person& __y) {
        return __x.id < __y.id;
    }
};

struct doCompareAction3 {
public:
    bool operator() (const Person& __x, const Person& __y) {
        return __x.id > __y.id;
    }
};

int main() {
    // 默认是 less  return 对象1 < 对象2;

    set<Person, doCompareAction2> setVar;

    // set<Person, doCompareAction3> setVar;

    // 构建对象
    Person p1 ("Snake", 1);
    Person p2 ("kevin", 2);
    Person p3 ("Derry", 3);

    // 把构建的对象 插入到 set 容器里面去
    setVar.insert(p1);
    setVar.insert(p2);
    setVar.insert(p3);

    // name string  ---  c_str() ---->   char *
    for (set<Person>::iterator it = setVar.begin(); it != setVar.end() ; it ++) {
        cout << it->name.c_str() << " , " << it->id << endl;
    }

    return 0;
}


相关文章

网友评论

      本文标题:C++ 容器浅析

      本文链接:https://www.haomeiwen.com/subject/oaibhltx.html