C++ STL 数据结构的基本操作

本文详细介绍了C++ STL中的vector、string和unordered_map三种数据结构,包括它们的构造方法、基本操作和常用计算。对于vector,讲解了构造、push_back、pop_back等操作;对于string,涵盖了构造、拼接、查找和转换功能;unordered_map部分则阐述了其适配器栈和队列的操作。此外,还提到了priority_queue作为优先队列的特性及其使用。
摘要由CSDN通过智能技术生成


一、vector

1.构造

  • vector< int > vec; 默认初始化

  • vector< int > vec(vec1); 拷贝构造

  • vector< int > vec = vec1; 赋值

  • vector< int > vector(vec.begin + index1, vec.end()- index2); 指定范围构造

  • vector< int > vec={1,2,3,4,5}; 具体数值构造

  • vector< int > vec(num); 指定vector内元素个数num

  • vector< int > vec(num, value); 指定元素个数num,并初始化为value

1.基本操作

  • push_back(value) 在数组的最后添加一个数据

  • emplace_back(value) 在数组的最后添加一个数据

  • pop_back() 去掉数组的最后一个数据

  • at(i) 得到编号位置的数据

  • begin() 得到数组头的指针

  • end() 得到数组的最后一个单元+1的指针

  • front() 得到数组头的引用

  • back(0 得到数组的最后一个单元的引用

  • max_size() 得到vector最大可以是多大

  • capacity() 当前vector分配的大小

  • size() 当前使用数据的大小

  • resize(size) 改变当前使用数据的大小,如果它比当前使用的大,者填充默认值

  • reserve(capacity) 改变当前vecotr所分配空间的大小

  • erase(index) 删除指针指向的数据项

  • clear() 清空当前的vector

  • rbegin() 将vector反转后的开始指针返回(其实就是原来的end-1)

  • rend() 将vector反转构的结束指针返回(其实就是原来的begin-1)

  • empty() 判断vector是否为空(vector.empty())

  • swap(v1,v2) 与另一个vector交换数据

3.基本计算

  • 求和: accumulate(v.begin(), v.end(), initalSumValue)

accumulate 算法在numeric.h头文件中定义
accumulate 带有三个形参:头两个形参指定要累加的元素范围,第三个形参则是累加的初值

  • 求最大、最小值: *max_element(), *min_element()

  • 排序: sort(v.begin(), v.end())


二、string

1.构造

  • string s1; 默认构造函数,s1为空串

  • string s2(s1); 拷贝构造函数,将s2初始化为s1的一个副本

  • string s3(“valuee”); 将s3初始化一个字符串面值副本

  • string s4(n,‘c’); 将s4 初始化为字符’c’的n个副本

  • cin>>s5; 读取有效字符到遇到空格

  • getline(cin,s6); 读取字符到遇到换行,空格可读入,直到‘\n’结束

  • getline(cin,s7,‘a’); 一个直到‘a’结束,其中任何字符包括’\n’都能够读入,

2.基本操作

  • 判空:s.empty() 判断是否为空,bool型

  • 字符串长度:s.size()s.length() 返回字符的个数

  • 字符索引:s[i] 返回位置为n的字符,从0开始计数

  • 字符串拼接:s1+s2 连接,看下面例子:

    可用此方法给字符串后面添加字符如:s=s+‘a’;

a:  string s2=s1+", ";  //对,把一个string对象和一个字符面值连接起来是允许的

b:  string s4="hello"+", ";   //错,不能将两个字符串面值相加

c:  string s5=s1+", "+"world";   //对,前面两个相加相当于一个string对象;

d:  string s6="hello" + ", " +  s2;  //错
  • 字符串尾部追加:append()

    s.append("abc");
    s.append(s1);
    
  • 插入字符: insert(pos,args):在pos之前插入字符args指定的字符

    s.insert(s.size(),"tail");//在字符串末尾插入字符串“tail”
    
  • 删除字符:

    • erase(pos,len):删除从pos位置开始的len个字符

         s.erase(s.size()-5,5);//删除字符串最后5个字符
      
    • iterator erase(const_iterator first, const_iterator last):删除迭代器指定范围 [first, last) 内的字符

         s.erase(s.end()-5,s.end());//删除字符串最后5个字符
      
  • 替换/赋值:s1=s2

  • 字符串比较:

    • s1 == s2 相等,返回 true 或 false
    • !=, <, <=, >, >= 字符串比较,两个字符串短的与长的前面匹配,短的小于长的
    • compare()
    s1.compare(s2);
    
    • 比较时逐字符比较的,一旦能比较出结果,就不再比较了
    • 两个字符串 相同,返回 0
    • 调用字符串 小于 被调用字符串,返回 -1
    • 调用字符串 大于 被调用字符串,返回 1
  • 查找:find(s) 找第一个出现的字符串s,返回其下标值

  • 获取子串:substr(startIndex, len) 从下标startIndex开始查找长度为len的子串

  • 替换:replace(range,args):删除range范围内的字符,替换为args指定的字符。range可以是一个下标和长度,或者是一对指向字符串的迭代器。

     s.replace(11,3,"5th");//替换从下标11开始的3个字符
    
    • (1)用string 或C-string 代替操作string 中从 _Pos1 开始的 _Num1 个字符
    basic _ string& replace( size _ type _Pos1 ,size _ type _Num1 , const value _ type* _Ptr );
    
    basic _ string& replace(size _ type _Pos1 ,size _ type _Num1 ,const basic _ string _Str );
    
    • (2)用string 中从 _Pos2 开始的 _Num2 个字符,代替操作string 中从 _Pos1 开始的 _Num1 个字符;用C-string 中的 _Num2 个字符,代替操作string 中从 _Pos1 开始的 _Num1 个字符
    basic _ string& replace( size _ type _Pos1 , size _ type _Num1 , const basic _ string& _Str ,size _ type _Pos2 , size _ type );
    
    basic _ string& replace( size _ type _Pos1 , size _ type _Num1 ,const value _ type* _Ptr , size _ type _Num2 );
    

3.string对象中字符的处理

(头文件cctype.h

  • 常见判断

    • isalnum(s): 如果c是字母或数字,返回 true

    • isalpha(s): 如果c是字母,返回true

    • iscntrl(s): c是控制符,返回true

    • isdigit(s): 如果c是数字,返回true

    • isgraph(s): 如果c不是空格,则可打印,,则为true

    • islower(s): 如果c是小写字母,则为true

    • isupper(s): 如果c是大写字符,则为true

    • isprint(s): 如果c是可打印的字符,则为true

    • ispunct(s ): 如果c是标点符号,则为true

    • isspace(s): 如果c是空白字符,则为true

    • isxdigit(s) :如果c是十六进制数,则为true

  • 大小写转换

    • tolower(s) :如果c是大写字符,则转换为其小写字母,否则直接返回c

    • toupper(s) : 如果c是小写字符,则转换为其大写字母,否则直接返回c

  • 字符串与数值之间的转换

    • to_string(value):将任意类型的数值转换为string类型
    • stoi(s):string->int (注意:待转成数字的字符串不能以0开头
    • stol(s):string->long
    • stof(s):string->float
    • stod(s):string->double

三、unordered_map

适配器

一、栈stack

二、队列 queue、priority_queue

1、queue

定义

  • 默认构造:std::queue < dataType > que;
  • 拷贝构造:std::queue < dataType > que(q);
  • std::queue < int > que{1, 2, 3, 4};

常用操作

  • front():返回 queue 中第一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义的。
  • back():返回 queue 中最后一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义的。
  • push(const T& obj):在 queue 的尾部添加一个元素的副本。这是通过调用底层容器的成员函数 push_back() 来完成的。
  • push(T&& obj):以移动的方式在 queue 的尾部添加元素。这是通过调用底层容器的具有右值引用参数的成员函数 push_back() 来完成的。
  • pop():删除 queue 中的第一个元素。
  • size():返回 queue 中元素的个数。
  • empty():如果 queue 中没有元素的话,返回 true。
  • emplace(arg):用传给 emplace() 的参数调用 T 的构造函数,在 queue 的尾部生成对象。
  • swap(queue &other_q):将当前 queue 中的元素和参数 queue 中的元素交换。它们需要包含相同类型的元素。也可以调用全局函数模板 swap() 来完成同样的操作。

2、 priority_queue 优先队列(队列中最大元素总是位于队首,可用于构建大顶堆)

定义
(1)普通定义

priority_queue < int > q;              //按照元素从大到小的顺序出队

priority_queue< vector < int >, less < int > > pq1;     //按照元素从大到小出队列

priority_queue< int, vector < int >, greater < int > > q;   //按照元素从小到大的顺序出队

//构造一个空的优先队列(此优先队列默认为大顶堆)
priority_queue<int> big_heap;   
//另一种构建大顶堆的方法
priority_queue<int,vector<int>,less<int> > big_heap2;   

//构造一个空的优先队列,此优先队列是一个小顶堆
priority_queue<int,vector<int>,greater<int> > small_heap;   

(2)自定义优先级:
struct cmp {
  operator bool ()(int x, int y)
  {
     return x > y;   // x小的优先级高 //也可以写成其他方式,如: return p[x] > p[y];表示p[i]小的优先级高
  }
};
priority_queue< int, vector < int >, cmp > q; //定义方法

基本操作

empty()    如果队列为空,则返回真

pop()    删除对顶元素,删除第一个元素

push()    加入一个元素

size()     返回优先队列中拥有的元素个数

top()     返回优先队列对顶元素,返回优先队列中有最高优先级的元素


总结

参考链接:
vector: https://www.cnblogs.com/littleswan/p/12143646.html
string: https://www.cnblogs.com/lanclot-/p/11142202.html
string: https://www.cnblogs.com/hgfgood/p/4248323.html
queue: http://c.biancheng.net/view/479.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值