前言
本学习笔记根据学习进程中遇到的问题更新,因此并不是按大类进展。由于string类也是类模板,虽然不是容器,但与容器相似,因此只介绍string类和容器间的区别。
用法
1. 声明和初始化
区别:容器中的指向均是半开半闭区间,例如vetcor.beign(),vector.begin()+3 意味着vector[0]~vector[2](闭区间)
而string中均为闭区间。
//vector construction
string s1(4,'c'); // 'c' is repeated four times
string s2("hello world", 1, 6); //copy char[1] ~ char[5] , that is "ello w"
//string initialization
string s3("hello world"),s4;
s4.assign(s3, 3, 6); // clear srting, s4 = "lo w",that is s3[3]~s3[7]
s4.assign("hello world", 3, 6); // clear srting, s4 = "lo w",that is char[3]~char[7]
2. 基本操作
(1)增加或删除元素
用+和+=可以实现char、string的拼接。
string s5("abc"), s6("zyx");
s5.append(s6); //s5 = "abczyx"
s5.append(s6,1,2); //s6 = "abcyx"
s5.insert(2,3,'A'); // str[2] (包括[2])后插入3个'A'
s5.insert(2,"abc"); // str[2] (包括[2])后插入"abc"
s5.erase(2); //删除str[2] (包括[2])后全部元素
s5.erase(1,2); //删除str[1] (包括[1])后2个元素
s5.replace(1,2,"abc") //从str[1]开始替换2个字符(删除str[1]开始的2个字符),替换为"abc"
/*
include <algorithm> 中提供了
replace(str.begin(),str.end(),'a', 'b') // 从str.begin()~str.end()将'a'替换为'b',仅能单字符操作
*/
(2)算法
#include <algorithm>
s5.find_first_of("bca"); //查找s5和"bca"任意一个相同字符,有就返回第一个相同的位置
(3)比较
用==、!=、<、>、>=、<=可以实现字符串比较
s5.compare("abc"); //完全相同返回0,完全不同返回<0,部分相同返回>0
s5.compare(1, 5, "abcds",2,4); // s5[1]开始5个字符和"abcds"[2]开始4个字符比较
s5.compare(1, 5, "abcds",4); // s5[1]开始5个字符和"abcds"[0]开始4个字符比较
/*
include <algorithm> 中提供了
replace(str.begin(),str.end(),'a', 'b') // 从str.begin()~str.end()将'a'替换为'b',仅能单字符操作
*/
(4)拷贝
string str;
str.c_str(); // 返回const char*, 以'\0'结尾
str.data(); // 返回const char*,不以'\0'结尾
str.copy(p,n,pos=0); // 从string中赋值n个字符到p指针指向的空间中(p可以是char*),从pos开始
3. char*、char[]、string区别和转换
char* p = “hello”,p是一个字符指针,存储在内存stack上;"hello"是字符串常量,存储在文字常量区,不可更改;
char[]是一个字符数组,存储在st上;
string是string类对象。
(1) char*和char[]转string:
可以直接赋值。
string s;
char* p = "hello";
char str[] = "world";
s = p; //直接赋值
s = str; //赋值方式1
string s1(str); //赋值方式2
(2) string 转char[]
不能直接赋值,需要循环或strcpy_s函数;
string s = "hello";
char str2[8];
/*方法1*/
for (int i = 0; i < s.length(); i++)
{
str2[i] = s[i];
}
strcpy_s(str2, s.c_str()); // 方法2
(3) string转char*
string 转const char* ,采用2个函数,第一个.c_str()函数,第二个.data()成员函数。
如果需要使用char* 需要开辟动态空间。
string s = "hello world";
const char *p1 = s.c_str(); //方法1
const char *p2 = s.data(); //方法2
char * p3;
int len = s.length();
p3 = new char;
p3 = (char *)malloc((len+1)*sizeof(char));
s1.copy(p3,len,0); // 方法3