-
string类
需要包含头文件<string>
#include <iostream>
#include <string>
using namespace std;
int main()
{
//正确初始化
string s1("hello");
string month = "March";
string s2(8, 'x');
string s; s = 'n'; // 可以将字符赋值给string对象
//错误初始化
//string error1 = 'c';
//string error2('u');
//获取字符串长度(.length()和.size()方法)
cout<<"s1的长度为: "<<s1.length()<<endl;
cout<<"s1的长度为: "<<s1.size()<<endl;
//字符串的赋值和连接(赋值:=、assign() 连接:+、append())
string s3, s4, s5;
s3 = s1; //用=赋值
s4.assign(s1); //用assign成员函数赋值
s5.assign(s1, 1, 3); //从s1中下标为1的字符开始复制3个字符给s5
s5[2] = 'a'; //单个字符赋值
s1 += s2;
s1.append(s2);
s1.append(s2,3, s2.size()); //下标从3开始,一共连接s2.size()个字符。如果字符串内没有足够字符,则复制到字符串最后一个字符
//逐个访问string对象中的字符(.at()和[])
for(int i=0; i<s3.length(); i++){
cout << s3.at(i) << endl; //成员函数at会做范围检查,如果超出范围,会抛出out_of_range异常,而下标运算符[]不做范围检查
}
//字符串的比较(== > >= < <= != 或者 .compare())
string s6 = "cplusplus";
string s7 = "clion";
bool b = (s6==s7); //返回值是bool值
int b1 = s7.compare(s6); //返回值是int值,0表示相等,1表示前者大于后者,-1表示前者小于后者(这里大小是字典序比较的大小)
cout << b << endl;
cout << b1 << endl;
//子串substr
string s8 = s6.substr(4, 7); //下标4开始7个字符,如果字符串内不够字符,则取到最后一个字符
cout << s8 << endl;
//交换swap
s6.swap(s7);
cout << s6 << ", " << s7 << endl;
//寻找字符串中的字符
string s9 = "hello world";
cout << s9.find("lo") << endl; //从前往后查找"lo"第一次出现的位置
cout << s9.rfind("lo") << endl; //从后往前查找"lo"第一次出现的位置
cout << s9.find("ll", 1) << endl; //从下标1开始,从前往后查找"lo"第一次出现的位置
cout << s9.find("ll", 2) << endl;
cout << s9.find("ll", 3) << endl;
cout << s9.find_first_of("abcd") << endl; //查找"abcd"中任一字符第一次出现的位置,找到就返回该位置;找不到就返回string::npos
cout << s9.find_last_of("abcd") << endl; //查找"abcd"中任一字符最后一次出现的位置,找到就返回该位置;找不到就返回string::npos
cout << s9.find_first_not_of("abcd") << endl; //查找不在"abcd"中的任一字符第一次出现的位置,找到就返回该位置;找不到就返回string::npos
cout << s9.find_last_not_of("abcd") << endl; //查找不在"abcd"中的任一字符最后一次出现的位置,找到就返回该位置;找不到就返回string::npos
//删除string中的字符(erase())
string s10 = "hello world";
s1.erase(5); //删除下标5及以后的字符
cout << s1 << endl;
//替换string中的字符
string s11 = "hello world";
s11.replace(2,3,"hhh"); //将s11中下标2开始的3个字符替换为hhh
cout << s11 << endl;
s11.replace(2,3,"haha",1,2); //将s11中下标2开始的3个字符替换为haha中下标1开始的2个字符
cout << s11 << endl;
//在string中插入字符串
string s12 = "hello world";
string s13 = "show insert";
s12.insert(5,s13); //s12中下标为5的地方插入s13
cout << s12 << endl;
s12.insert(5,s13,2,3); //s12中下标为5的地方插入s13中下标2开始的3个字符
cout << s12 << endl;
return 0;
}
-
STL中的算法
需要包含头文件#include <algorithm>
#include <iostream>
#include <algorithm>
using namespace std;
void printArr(int *p, int size){
for(int i=0; i<size; i++){
if(i < size -1)
cout << *(p+i) << ", ";
else
cout << *(p+i) << endl;
}
}
int main()
{
int arr[] = {12, 9, 23, 7, 15, 5};
//基本类型数组从小到大排序,左闭右开sort(arr+n1, arr+n2)
sort(arr, arr + sizeof(arr)/sizeof(int));
printArr(arr, sizeof(arr)/sizeof(int));
//基本类型数组从大到小排序,左闭右开sort(arr+n1, arr+n2, greater<T>())
sort(arr, arr + sizeof(arr)/sizeof(int), greater<int>());
printArr(arr, sizeof(arr)/sizeof(int));
//自定义排序规则结构体
/*
struct 结构名 {
bool oprator() (const T & a1, const T & a2) const {
//若a1应该在a2前面,则返回true;否则返回false
}
};
*/
//按个位数从小到大排序
struct Rule{
bool operator() (const int & a1, const int & a2) const {
return a1%10 < a2%10;
}
};
sort(arr, arr + sizeof(arr)/sizeof(int), Rule());
printArr(arr, sizeof(arr)/sizeof(int));
//二分查找binary_search(),返回值为true或者false。注意先排序再查找
sort(arr, arr + sizeof(arr)/sizeof(int));
cout << binary_search(arr, arr + sizeof(arr)/sizeof(int), 15) << endl;
sort(arr, arr + sizeof(arr)/sizeof(int), Rule());
cout << binary_search(arr, arr + sizeof(arr)/sizeof(int), 15,Rule()) << endl; //按自定义规则进行查找
//lower_bound(arr+n1, arr+n2, 值, 规则), upper_bound(), 返回一个指针,指向查到的值,若查不到则指向下标为n2的元素。同样,也是要先排序再查找
sort(arr, arr + sizeof(arr)/sizeof(int));
int* p = lower_bound(arr, arr + sizeof(arr)/sizeof(int), 12); //查找大于等于目标值的下标最小的那个值
cout << "index: " << p-arr << " value: " << *p << endl;
int* q = upper_bound(arr, arr + sizeof(arr)/sizeof(int), 12); //查找大于目标值的下标最小的那个值
cout << "index: " << q-arr << " value: " << *q << endl;
return 0;
}
当需要动态维护数据时,进行查找就无法使用排序+二分了,因为一旦新加入数据就要重新排序。我们可以使用平衡二叉树的数据结构存放数据,便于动态维护。体现在STL中,就是以下四种排序容器:
multiset set multimap map
-
STL中的容器(multiset set)
#include <iostream>
#include <algorithm>
#include <set>
using namespace std;
int main()
{
int arr[7] = {12, 9, 23, 7, 15, 5, 9};
multiset<int> st; //定义一个multiset变量st,存放int类型数据,允许有重复元素,并且能自动排序,默认从小到大排序。开始st为空。
for(int i=0; i<7; i++){
st.insert(arr[i]); //将数组中的元素放入st中
}
multiset<int>::iterator i; //迭代器,类似于指针.可以++, --,用==和!=比较,但不能比大小,不能加减整数,不能相减。
for(i = st.begin(); i!=st.end(); i++){ //st.begin()返回一个指向st中头一个元素的迭代器;st.end()返回一个指向st中最后一个元素后面的迭代器
cout << *i << ",";
}
cout << endl;
i = st.find(22); //查找22,返回值是迭代器
if(i == st.end())
cout << "not found" << endl;
else
cout << "found: " << *i << endl;
i = st.lower_bound(9);
cout << *i << endl;
i = st.upper_bound(9);
cout << *i << endl;
//同样,自定义排序规则的multiset可如下定义:
// multiset<int, greater<int> > st; 排序规则为从大到小
// multiset<int, Rule> st;
// 注意这里规则那里不加()
cout << st.size() << endl; //返回容器的大小
set<int> st2; //set类型不能有重复元素,其他跟multiset类似
for(int i=0; i<7; i++){
st2.insert(arr[i]); //将数组中的元素放入st中
}
set<int>::iterator i2;
for(i2=st2.begin();i2!=st2.end();i2++){
cout << *i2 << ",";
}
cout << endl;
return 0;
}
-
STL中的容器(vector deque list)