一些常用STL容器总结

stack 容器

只有栈顶元素才可以被外界使用,不允许有遍历行为

  • 构造函数

      stack<T> stk;
      
      stack(const stack &stk);
    
  • 赋值操作

      stack& operator=(const stack &stk);
    
  • 数据存取

      push(elem);
      
      pop();
      
      top();
    
  • 大小操作

      empty();
    
      size();
    

queue 容器

  • 构造函数

      queue<T> que;
      
      queue(const queue &stk);
    
  • 赋值操作

      queue& operator=(const queue &que);
    
  • 数据存取

      push(elem);
      
      pop();
      
      back();
    
      front();
    
  • 大小操作

      empty();
    
      size();
    

set / multiset 容器

本质: 属于关联式容器,底层结构用二叉树实现

区别: set不允许容器中有重复的元素, multiset允许容器中有重复的元素

  • 构造和赋值操作

      set<T> st;
      
      set(const set& st);
      
      set& operator=(const set &st);
    
      插入数据只有insert方式,并且所有元素插入时被自动排序。
    
  • 大小和交换

      size();
    
      empty();
    
      swap();
    
  • 插入和删除

      insert(elem);
    
      clear();
    
      erase(pos);
    
      erase(beg, end);
    
      erase(elem);
    
  • 查找和统计

      find(key);//如果元素存在返回该元素的位置,否则返回容器结束的位置
      
      count(key);//统计key元素个数
    
  • pari 使用

创建方式:

//利用对组可以返回两个数据	

pair<type, type> p(value1, value2);

pair<type, type> p = make_pair(value1, value2);

//第一种
pair<string, int>p("Tom", 20);

//第二种
pair<string, int>p2 = make_pair("Jerry", 30);
  • set 容器排序

技术点:利用仿函数,改变排序规则

示例一:

1. set存放内置数据类型

class MyCompare
{
public:
	bool operator()(int v1, int v2) const //返回类型是bool型,重载的符号是()。仿函数
	{
		return v1 > v2;
	}
};

void test01()
{
	set<int, MyCompare> s1;

	s1.insert(10);
	s1.insert(20);
	s1.insert(30);
	s1.insert(60);
	s1.insert(50);
	s1.insert(90);

	for (set<int, MyCompare>::iterator it = s1.begin(); it != s1.end(); it++)
	{
		cout << *it << " ";
	}
}

利用仿函数可以指定set容器的排序规则

2. set存放自定义数据类型

class Person
{
public:

	Person(string name, int age, int height)
	{
		this->m_Name = name;
		this->m_Age = age;
		this->m_Height = height;
	}
public:

	string m_Name;
	int m_Age;
	int m_Height;
};

class MyCompare
{
public:
	bool operator()(const Person& v1, const Person& v2) const //返回类型是bool型,重载的符号是()。仿函数
	{
		return v1.m_Age > v2.m_Age;
	}
};

void test01()
{
	set<Person, MyCompare> s1;//自定义数据类型要自行制定排序规则

	Person p1("堂本光一", 10, 170);
	Person p2("堂本刚", 11, 171);
	Person p3("谢霆锋", 12, 175);
	Person p4("肖战", 26, 170);
	Person p5("王一博", 20,170);
	Person p6("丁真", 18, 170);

	s1.insert(p1);
	s1.insert(p2);
	s1.insert(p3);
	s1.insert(p4);
	s1.insert(p5);
	s1.insert(p6);

	for (set<Person, MyCompare>::iterator it = s1.begin(); it != s1.end(); it++)
	{
		cout << it->m_Name << " " << it->m_Age << " " << it->m_Height << endl;
	}
}

map / multimap 容器

简介: map中所有元素都是pair,pair中第一个元素为key,起到索引作用,第二个元素为value(实值),所有元素都会根据键值自动排序,可以根据键值快速找到value值

本质: 属于关联式容器,底层结构用二叉树实现

区别: map不允许容器中有重复的key元素, multimap允许容器中有重复的key元素

  • 构造和赋值操作

      map<T1, T2> mp;
      
      map(const map &mp);
      
      map& operator=(const map &mp);
    
      map<int, int> m;
      
      m.insert(pair<int, int>(1, 10));
    
      cout << (*it).first << (*it).second << endl;
    
  • 大小和操作

      size();
    
      empty();
    
      swap();
    
  • 插入和删除

      insert(elem);
      
      clear();
      
      erase(pos);
      
      erase(beg, end);
      
      erase(key);
    
      map<int, int> m;
      
      m.insert(make_pair(2, 20));
    
  • 查找和统计

      find(key); //查找key是否存在,若存在返回该键的元素的迭代器,若不存在,返回map.end()
    
      count(key);
    
  • map容器排序

  • 利用仿函数改变排序规则

同其它容器

map<int, int, MyCompare> m;

list 容器

将数据进行链式存储,STL中的链表是一个双循环链表,遍历速度没有数组快,灵活但占用空间大

  • 函数原型

      list<T> list;
      
      list(beg, end);
      
      list(n, elem);
      
      list(const list& list);//拷贝构造函数
    

list 赋值和交换

  • 函数原型

      assign(beg, end);
      
      assign(n, elem);
      
      list& operator=(const list &list);
      
      swap(list);
    

list 大小操作

  • 函数原型

      size();
    
      empty();
    
      resize(num);
    
      resize(num, elem);
    

list 大小操作

  • 函数原型

      push_back(elem);
    
      pop_back();
    
      push_front(elem);
    
      pop_front();
    
      insert(pos, elem); // 必须提供迭代器
    
      insert(pos, n, elem);
    
      insert(pos, beg, end);
    
      clear();
    
      erase(beg, end);  必须提供迭代器
    
      erase(pos);
    
      remove(elem);
    

list 数据存取

  • 函数原型

      front(); //返回第一个元素
      
      back(); //返回最后一个元素
    

迭代器不支持随机访问,只能递增或者递减

list 反转和排序

reverse(); //反转链表

sort(); //链表排序

如何写降序函数

bool myCompare(int v1, int v2)
{
	return v1 > v2;
}

L1.sort(myCompare);//降序排列

list 排序案例

#include <iostream>
using namespace std;
#include <deque>
#include <vector>
#include <string>
#include <algorithm>
#include <queue>
#include <list>

class Person
{
public:

	Person(string name, int age, int height)
	{
		this->m_Name = name;
		this->m_Age = age;
		this->m_Height = height;
	}
public:

	string m_Name;
	int m_Age;
	int m_Height;
};

//指定排序规则
bool comparePerson(Person& p1, Person& p2)
{
	//按照年龄升序
	if (p1.m_Age == p2.m_Age)
	{
		return p1.m_Height > p2.m_Height;
	}
	return p1.m_Age < p2.m_Age;
}

void test01()
{
	list<Person> L;

	Person p1("刘备", 35, 175);
	Person p2("曹操", 45, 180);
	Person p3("孙权", 40, 170);
	Person p4("赵云", 26, 190);
	Person p5("张飞", 35, 160);
	Person p6("关羽", 35, 200);

	L.push_back(p1);
	L.push_back(p2);
	L.push_back(p3);
	L.push_back(p4);
	L.push_back(p5);
	L.push_back(p6);

	for (list<Person>::iterator it = L.begin(); it != L.end(); it++)
	{
		cout << it->m_Age << " " << it->m_Name << " " << it->m_Height << endl;
	}
	cout << "排序后: " << endl;

	L.sort(comparePerson);

	for (list<Person>::iterator it = L.begin(); it != L.end(); it++)
	{
		cout << it->m_Age << " " << it->m_Name << " " << it->m_Height << endl;
	}
}

int main()
{
	test01();

	system("pause");

	return 0;
}

deque 容器

deque是双端数组,可以对头端进行删除操作

deque与vector区别:

1.vector单端数组,对于头部的插入效率较低,数据量越大,效率越低

2.deque对头部的插入速度比vector快

3.vector访问元素时的速度会比deque快,这和两者内部实现有关

deque内部工作原理:deque内部有个中控器,维护每段缓冲区中的内容,缓冲区中存放真实数据,中控器维护的是每个缓冲区的地址,使得使用deque时像一片连续的内存空间,因此访问数据会慢一些。

  • deque构造函数

函数原型:

deque<T> deqT;//默认构造形式

deque(beg, end);//构造函数将[beg,end]区间中的元素拷贝给本身

deque(n, elem);//构造函数将n个elem拷贝给本身

deque(const deque &deq);//拷贝构造函数

示例:

void myprint(const deque<int>& d)
{
	for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}
const 限制容器为只读不可修改,于是it的类型也应该是const类型,由const性质可得。
  • deque赋值操作

函数原型:

deque& operator=(const deque& deq);//重载等号操作符

assign(beg, end);//将[beg,end]区间中的数据拷贝赋值给本身

assign(n, elem);//将n个elem拷贝赋值给本身
  • deque大小操作

函数原型:

说明:类似vector,但没有容量限制,因此没有capacity函数

empty();

size();

resize(num);

resize(num, elem);
  • deque插入和删除

函数原型:

push_back(elem);

push_front(elem);

pop_back();//删除最后一个数据

pop_front();//删除第一个数据

insert(pos, elem); //在pos位置插入elem,返回新数据的位置

insert(pos, n, elem); //在pos位置插入n个elem数据,无返回值

insert(pos, beg, end); //插入区间数据,无返回值

clear();

earse(beg, end);//删除区间数据,返回下一个数据的位置

earse(pos); //删除pos位置的数据,返回下一个数据的位置
  • deque数据存取

函数原型:

at(int idx);

operator[];

front();

back();
  • deque排序操作

函数原型:

sort(itrator beg, iterator end);//对区间内的数据进行排序,升序

所有算法必须包含的头文件 <algorithm>,STL三大组件,容器、算法和迭代器
### C++ STL String 类常用方法总结 以下是关于 `std::string` 的一些常见操作及其功能说明: #### 1. 构造字符串对象 可以通过多种方式创建 `std::string` 对象,例如默认构造、初始化列表或者拷贝构造等方式[^3]。 ```cpp #include <iostream> #include <string> int main() { std::string str1; // 默认构造 std::string str2("hello world");// 初始化为指定字符序列 std::cout << str1 << std::endl; std::cout << str2 << std::endl; return 0; } ``` #### 2. 字符串大小与容量 可以使用成员函数获取字符串长度以及调整其容量。 - **size()**: 返回当前存储的字符数。 - **length()**: 同 size(), 表示有效字符数量。 - **capacity()**: 获取分配的空间大小。 - **resize(n)**: 调整字符串的有效长度至 n。 - **reserve(n)**: 预留至少能容纳 n 个字符的空间。 ```cpp #include <iostream> #include <string> int main() { std::string s = "abcdef"; std::cout << "Size: " << s.size() << ", Capacity: " << s.capacity() << std::endl; s.resize(10, 'z'); // 扩展到 10 个字符并填充 'z' std::cout << "Resized: " << s << std::endl; s.reserve(50); // 提前预留空间 std::cout << "Capacity after reserve: " << s.capacity() << std::endl; return 0; } ``` #### 3. 修改字符串内容 提供了一系列用于修改字符串的方法,比如替换子串、追加新数据等。 - **append(str)** 或者运算符 += : 将另一个字符串附加到现有字符串后面。 - **insert(pos, str)**: 插入一段新的文本到特定位置 pos 处。 - **erase(start_pos, num_chars)**: 删除从 start_pos 开始的 num_chars 个字符。 - **replace(start_pos, num_chars, new_str)**: 替代部分区域的内容。 ```cpp #include <iostream> #include <string> int main() { std::string s = "Hello"; s.append(", World!"); // 添加额外的部分 std::cout << s << std::endl; s.insert(5, " there"); // 在索引 5 处插入文字 std::cout << s << std::endl; s.erase(5, 6); // 移除中间的一段话 std::cout << s << std::endl; s.replace(6, 7, "Universe"); // 更改某些词语 std::cout << s << std::endl; return 0; } ``` #### 4. 查找和比较 支持查找某个子串的位置以及执行各种形式的对比测试。 - **find(substr)** 和 **rfind(substr)**: 寻找第一次/最后一次出现 substr 的地方;如果找不到则返回 `std::string::npos`. - **compare(otherStr)**: 判断两个字符串之间的字典序关系 (-1表示小于,0相等,+1大于). ```cpp #include <iostream> #include <string> int main() { std::string s = "This is a sample sentence."; auto idx = s.find("sample"); if (idx != std::string::npos){ std::cout << "'sample' found at index: " << idx << std::endl; } bool isEqual = !s.compare("Another string."); std::cout << "Strings are equal? " << isEqual << std::endl; return 0; } ``` #### 5. 字母转换及其他辅助工具 还包含了针对单个字母的操作手段,如转成大写或小写字母等功能[^1]. - **tolower(c)/toupper(c)**: 把给定字符 c 变更为对应的小写 / 大写版本. ```cpp #include <iostream> #include <string> #include <cctype> int main(){ std::string s="ABCDEFG"; for(int i=0;i<s.size();i++) { s[i]=static_cast<char>(tolower(static_cast<unsigned char>(s[i]))); } std::cout<<s<<std::endl; return 0; } ``` 通过上述这些基本技巧的应用,能够极大简化日常开发中的字符串处理工作量。同时得益于标准模板库的强大特性,开发者无需手动管理内存即可轻松实现复杂逻辑[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值