STL-Collections

容器

string

概念

C风格字符串(以'\0'结尾)太过复杂,不适合大型程序开发,所以C++标准库定义了string类,位于头文件

string和C风格字符串对比:

  • char* 是一个指针,string是一个类
    • string封装了char *,管理这个字符串,是一个char *型的容器
  • string不用考虑内存释放和越界
    • string管理char *分配的内存。每一次string的复制都由string类负责维护,不用担心复制越界和取值越界等

常用API

构造函数

string();			//创建一个空的字符串 例如: string str;      
string(const string& str);	//使用一个string对象初始化另一个string对象
string(const char* s);		//使用字符串s初始化
string(int n, char c);		//使用n个字符c初始化

基本赋值

string& operator=(const string &str);	//把字符串s赋给当前的字符串
string& operator=(const char* s);	//char*类型字符串 赋值给当前的字符串
string& operator=(char c);		//字符赋值给当前的字符串
string& assign(const char *s);		//把字符串s赋给当前的字符串
string& assign(const char *s, int n);	//把字符串s的前n个字符赋给当前的字符串
string& assign(int n, char c);		//用n个字符c赋给当前字符串
string& assign(const string &str);	//把字符串s赋给当前字符串
string& assign(const string &str, int subpos, int sublen);	//将s从start开始n个字符赋值给字符串

长度

size_t length();
size_t size();

存取字符

char& operator[](int n);	//通过[]方式取字符
char& at(int n);		//通过at方法获取字符
越界时,[]会直接崩溃,at()会抛出异常

拼接

string& operator+=(const string& str);	//重载+=操作符
string& operator+=(const char* s);	//重载+=操作符
string& operator+=(char c);		//重载+=操作符
string& append(const char *s);		//把字符串s连接到当前字符串结尾
string& append(const char *s, int n);	//把字符串s的前n个字符连接到当前字符串结尾
string& append(int n, char c);		//在当前字符串结尾添加n个字符c
string& append(const string &str);	//同operator+=()
string& append(const string &str, int subpos, int sublen);//把字符串s中从pos开始的n个字符连接到当前字符串结尾

查找和替换

int find(const string& str, int pos = 0) const; 	//查找str第一次出现位置,从pos开始查找
int find(const char* s, int pos = 0) const;  		//查找s第一次出现位置,从pos开始查找
int find(const char* s, int pos, int n) const;  	//从pos位置查找s的前n个字符第一次位置
int find(char c, int pos = 0) const;  			//查找字符c第一次出现位置
int rfind(const string& str, int pos = npos) const;	//查找str最后一次位置,从pos开始查找
int rfind(const char* s, int pos = npos) const;		//查找s最后一次出现位置,从pos开始查找
int rfind(const char* s, int pos, int n) const;		//从pos查找s的前n个字符最后一次位置
int rfind(char c, int pos = 0) const; 			//查找字符c最后一次出现位置
string& replace(int pos, int len, const string& str); 	//替换从pos开始n个字符为字符串str
string& replace(int pos, int len, const char* s); 	//替换从pos开始的n个字符为字符串s

比较

/*
compare函数在>时返回 1,<时返回 -1,==时返回 0。
比较区分大小写,比较时参考字典顺序,排越前面的越小。
*/
int compare(const string &str) const;//与字符串s比较
int compare(const char *s) const;//与字符串s比较

子串

string substr(int pos = 0, int len = npos) const;	//返回由pos开始的n个字符组成的字符串

插入和删除

string& insert(int pos, const char* s);		//插入字符串
string& insert(int pos, const string& str);	//插入字符串
string& insert(int pos, int n, char c);		//在指定位置插入n个字符c
string& erase(int pos = 0, int len = npos);	//删除从Pos开始的n个字符 

string和c-style字符串转换

//string 转 char*
string str = "itcast";
const char* cstr = str.c_str();

//char* 转 string 
char* s = "itcast";
string str(s);
  • 在c++中存在一个从const char*到string的隐式类型转换,却不存在从一个string对象到C_string的自动类型转换。对于string类型的字符串,可以通过c_str()函数返回string对象对应的C_string.

  • 通常,程序员在整个程序中应坚持使用string类对象,直到必须将内容转化为char*时才将其转换为C_string.

  • 为了修改string字符串的内容,下标操作符[]和at都会返回字符的引用。但当字符串的内存被重新分配之后,可能发生错误.

[];
at();
size();
length();
find();
+=
append();
erase();
push_back();
pop_back();
substr();

set

  • set集合中的元素有序唯一(根据特定的规则排序,由内部的比较方法决定)
  • 允许根据值来快速检索元素。(具有恒定的平均时间复杂度)
  • 元素的值即是key,不能在容器中修改(元素始终为const),可以插入和删除。
  • 相较unordered_set容器,访问单个元素更慢,但是允许基于subset元素的顺序直接进行迭代
  • 典型的实现是BST

set的元素值就是其键值,关系到set元素的排序规则。如果任意改变set元素值,会严重破坏set组织。换句话说,set的iterator是一种const_iterator.

set拥有和list某些相同的性质。当对容器中的元素进行插入操作或删除操作时,操作之前所有的迭代器,在操作完成之后依然有效,被删除的那个元素的迭代器必然是一个例外。

Container properties

Associative

  • Elements in associative containers are referenced by their key and not by their absolute position in the container.
  • 关联式容器通过值来访问,而不是在容器中的绝对位置

Ordered

  • The elements in the container follow a strict order at all times. All inserted elements are given a position in this order.
  • 容器中的元素遵循特定的排列顺序,所有插入的元素都按此规则指定插入位置

Set

  • The value of an element is also the key used to identify it.
  • 元素的key和value相同

Unique keys

  • No two elements in the container can have equivalent keys.
  • 不允许有两个相同的key

Allocator-aware

  • The container uses an allocator object to dynamically handle its storage needs.
  • 使用分配器动态扩容

multiset特性及用法和set完全相同,唯一的差别在于它允许键值重复。set和multiset的底层实现是红黑树。红黑树为平衡二叉树的一种。

  • Associative
  • Ordered
  • Set
  • Multiple equivalent keys
  • Allocator-aware

常用API

构造函数

set<T> st;		//set默认构造函数:
mulitset<T> mst; 	//multiset默认构造函数: 
set(const set &st);	//拷贝构造函数

赋值

set& operator=(const set &st);	//重载等号操作符
void swap(st);			//交换两个集合容器

容量

size_type size();	//返回容器中元素的数目
bool empty();		//判断容器是否为空

增删

pair<iterator, bool> insert(elem);	//在容器中插入元素
void clear();				//清除所有元素
iterator erase(pos);                    //删除pos迭代器所指的元素,返回下一个元素的迭代器
iterator erase(beg, end);        	//删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器
//对于multiset,会移除所有相等的元素
size_type erase(elem);	        	//删除容器中值为elem的元素

查找

iterator find(key);		//查找键key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end()
size_type count(key);		//查找键key的元素个数
iterator lower_bound(keyElem);	//返回第一个key>=keyElem元素的迭代器
iterator upper_bound(keyElem);	//返回第一个key>keyElem元素的迭代器
pair<iterator, iterator> equal_range(keyElem);//返回容器中key与keyElem相等的上下限的两个迭代器

unordered_set

  • unordered_set 集合中元素无序唯一。根据插入元素的哈希值组织成桶
  • 允许根据值来快速检索元素。(具有恒定的平均时间复杂度)
  • 元素的值即是key,不能在容器中修改,可以插入和删除
  • 相较set容器,访问单个元素更快,但是范围迭代效率更低

Container properties

Associative

  • 关联式容器通过值来访问,而不是在容器中的绝对位置

Unordered

  • 无序容器通过hash表来组织元素,允许通过key来快速访问

Set

  • 元素的key和value相同

Unique keys

  • 不允许有两个相同的key

Allocator-aware

  • 使用分配器动态扩容

stack

  • LIFO stack
  • stack是一种容器适配器,特性:last in first out
  • 元素的插入和取出在同一端
  • 默认通过对deque的封装来实现

常用API

容量

bool empty() const;		//容器是否为空
size_type size() const;  	//返回容器中元素的数量
void swap (stack& x) noexcept;	//Swap contents

增删

//Inserts a new element at the top of the stack, above its current top element. 
//The content of this new element is initialized to a copy of val.
void push (const value_type& val);
void push (value_type&& val);

void pop();	//Remove top element,This calls the removed element's destructor.会调用该元素的析构

template <class... Args> void emplace (Args&&... args);	//调用移动构造插入元素

查看

//Returns a reference to the top element in the stack.
//返回栈顶引用
reference top();
const_reference top() const;

queue

  • FIFO queue

  • queue是一种容器适配器,特性:first-in first-out

  • 元素从一端插入,从另一端取出

  • 默认通过对deque的封装来实现

常用API

容量

bool empty() const;		//容器是否为空
size_type size() const;	        //返回容器中元素的数量
void swap (queue& x) noexcept;	//Swap contents

增删

//Inserts a new element at the end of the queue, after its current last element.
//The content of this new element is initialized to val.
void push (const value_type& val);
void push (value_type&& val);

void pop();	//Remove top element,This calls the removed element's destructor.会调用该元素的析构

template <class... Args> void emplace (Args&&... args);	//调用移动构造插入元素

查看

//Returns a reference to the next element in the queue.
//返回队头引用
value_type& front();
const value_type& front() const;

//Returns a reference to the last element in the queue
//返回队尾引用
reference& back();
const_reference& back() const;

priority_queue

  • priority_queue是一种容器适配器,特性:第一个元素总是容器中最大/小的(根据指定的排序规则)
  • 类似于heap,可以随时插入元素,但只能检索最大元素(位于最顶部)
  • 默认通过对vector的封装来实现

常用API

容量

bool empty() const;		//容器是否为空
size_type size() const;  	//返回容器中元素的数量
void swap (queue& x) noexcept;	//Swap contents

增删

//Inserts a new element in the priority_queue. 
//The content of this new element is initialized to val.
void push (const value_type& val);
void push (value_type&& val);

void pop();	//Remove top element,This calls the removed element's destructor.会调用该元素的析构

template <class... Args> void emplace (Args&&... args);	//调用移动构造插入元素

查看

//Returns a constant reference to the top element in the priority_queue.
//返回队头引用
const_reference top() const;
posted @ 2022-03-22 21:29  oumae  阅读(23)  评论(0编辑  收藏  举报