各种“变态”的数据结构

STLSTLSTL (最基础的数据结构)

字符串 STRINGSTRINGSTRING

头文件: stringstringstring

  1. 读入
    使用 cincincin 读入时,遇到空白就停止读取。比如程序输入的是

hello world

那么我们得到的字符串是 hello ,而后面的空格以及 worldworldworld 就无法读出。
有时我们想把一整句话读入进来,又不想像上面那样创建无数个 stringstringstring 来保存单词,这是我们就用到了 getlinegetlinegetline 来获取一整行内容。

string str;
getline(cin, str);
  1. 处理字符串
    1. 当把 stringstringstring 对象和字符面值及字符串面值混在一条语句中使用时,必须确保 +++ 的两侧的运算对象至少有一个是 stringstringstring
    string s1 = s2 + ", "; //正确
    string s3 = "s " + ", "; //错误
    string s4 = "hello" + ", " + s1; //错误
    string s5 = s1 + "hello " + ", "; //改一下顺序,s1放前头,正确了,注意理解=号右边的运算顺序
    
    1. 访问字符串的每一个字符
    for(int i = 0; i < s3.size(); i++) {
        cout << s3[i] << endl;
    	s3[i] = 's';
    } 
    
    1. C++C++C++ 中有一个神奇的东西叫做迭代器 iteratoriteratoriterator ,我们可以用它来访问容器元素。
      在这里插入图片描述
    string str("hi sysu");
    for(string::iterator it = str.begin(); it != str.end(); it++) {
    	cout << *it << endl;
    }
    
    1. 查找字串
    string s("heoolo sdaa ss");
    cout << s.find("aa", 0) << endl; //返回的是子串位置。第二个参数是查找的起始位置,如果找不到,就返回string::npos
    if(s.find("sa", 0) == string::npos) {
    	cout << "找不到该子串!" << endl;
    }
    
    1. 字符串长度
    //string类型
    string str = "abcdef";
    int a = str.length();
    //char类型,strlen函数包含在 ·cstring· 头文件下
    int len = strlen(c);
    
  2. cctypecctypecctype 头文件中好玩的东西
  3. 其他有意思的函数
  • itoa():将整型值转换为字符串。
#include <cstdio>
#include <cstdlib>
int main() {
	int num = 100;
	char str[25];
	itoa(num, str, 10);	//num表示要操作的数字,str表示字符串,10表示数字的进制
	printf("The number 'num' is %d and the string 'str' is %s. \n" , num, str);
}

itoa并不是一个标准的C函数,它是Windows特有的,如果要写跨平台的程序,请用sprintf。是Windows平台下扩展的,标准库中有sprintf,功能比这个更强,用法跟printf类似:

char str[255];
sprintf(str, "%x", 100); //将100转为16进制表示的字符串。
  • ltoa():将长整型值转换为字符串。
  • atoi():将字符串转换为整型值。
  • atol():将字符串转换为长整型值。

VECTORVECTORVECTOR

头文件:vectorvectorvector

  1. 初始化
vector<类型> v
  1. 简单操作
    1. 添加元素 v.push_back
      使用 v.push_back 加入元素,并且这个元素是加在数组末尾的。
    for(int i = 1; i <= n; i++) {
    	v.push_back(i);
    }
    
    1. v.empty()
      如果 vvv 中不包含任何元素,返回真;否则返回假。
    2. v.size()
      返回 vvv 中元素的个数。
    3. 访问和操作 vectorvectorvector 中的每个元素
    for(int i = 0; i < v1.size(); i++){
        cout << v1[i] << endl;
        v1[i] = 100;
        cout << v1[i] << endl;
    }
    
    注意:只能对已存在的元素进行赋值或者修改操作。如果要加入新元素,必须用 push_back 。 push_back 的作用有两个:①告诉编译器为新元素开辟空间;②将新元素存入新空间里。
    当然我们也可以使用迭代器来访问元素。
    //正向迭代器
    vector<string> v = { "hi","my","name","is","lee" };
    for(vector<string>::iterator iter = v.begin(); iter != v.end(); iter++) {
        cout << *iter << endl;
        //下面两种方法都行
        cout << (*iter).empty() << endl;
        cout << iter->empty() << endl; 
    }
    //反向迭代器
    for (vector<string>::reverse_iterator iter = v.rbegin(); iter != v.rend(); iter++) {
        cout << *iter << endl;
    }
    
    1. 其他操作
  2. 如果 vectorvectorvector 元素类型是 intintint 类型,默认初始化为 000 ;如果是 stringstringstring 类型,默认初始化是空字符串。
  3. 一个较全的实现代码
    void showvector(vector<T> v) {
      	for(vector<T>::iterator it = v.begin(); it != v.end(); it++) {
      	    cout << *it;
      	}
      	cout << endl;
    }
    void work() {
    	vector<string> v6 = { "hi","my","name","is","lee" };
        v6.resize(3);  //重新调整vector容量大小
        showvector(v6);
    
        vector<int> v5 = { 1,2,3,4,5 }; //列表初始化,注意使用的是花括号
        cout << v5.front() << endl; //访问第一个元素
        cout << v5.back() << endl; //访问最后一个元素
    
        showvector(v5);
        v5.pop_back(); //删除最后一个元素
        showvector(v5);
        v5.push_back(6); //加入一个元素并把它放在最后
        showvector(v5);
        v5.insert(v5.begin()+1,9); //在第二个位置插入新元素
        showvector(v5);
        v5.erase(v5.begin() + 3);  //删除第四个元素
        showvector(v5);
        v5.insert(v5.begin() + 1, 7,8); //连续插入7个8
        showvector(v5);
        v5.clear(); //清除所有内容
        showvector(v5);
  4. inset 与 push_back 的操作有什么区别?
    顾名思义 push_back 把元素插入容器末尾, insert 把元素插入任何你指定的位置。不过 push_back 速度一般比 insert 快。如果能用 push_back 尽量先用 push_back。

MAPMAPMAP

LISTLISTLIST

QUEUEQUEUEQUEUE

单调队列

优先队列

双端队列

STACKSTACKSTACK

SETSETSET


基础数据结构

树状数组 BITBITBIT

线段树

并查集

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值