c++ string类的常用方法
- 1 - c++ string类的常用方法
一、C++ string类的常用方法
1、string类的构造函数
string() // 构造空串
string(const char* s) // 把null结尾的字符串s拷贝到字符串中
string(const string& str) // 拷贝构造函数,复制str到此串
string(char c, int n) // 用n个字符c构造串
string(const char* s, int n) // 拷贝字符数组中前n个字符
2、string类的成员函数
2.1 长度控制函数
int size() const; // 返回字符串的长度
int length() const; // 返回字符串的长度,等价于size()
void resize(int n, char c); // 改变字符串长度,如果n大于原来的长度,用字符c来填充
2.2 内容操作函数
string& operator=(const char* s); // 赋值,把s的内容复制到字符串中
string& assign(const char* s); // 赋值,把s的内容 - 2 - 复制到字符串中
string& append(const char* s); // 把字符串s添加到串尾
string& append(const char* s, int n); // 把s前n个字符添加到串尾
string& insert(int p0, const char* s); // 在p0位置上插入字符串s
string& erase(int p0, int n); // 删除p0开始,n个字符
int find(const char* s, int pos=0); // 在pos之后查找子串s,返回子串s在原串中的起始位置
int find(char c, int pos=0); // 从pos开始查找字符c,返回字符c在原串中的位置
int rfind(const char* substr,int pos=npos); // 从pos开始向前查找子串substr,返回子串substr在原串中的起始位置
int rfind(char c, int pos=npos); // 从pos开始向前查找字符c,返回字符c在原串中的位置
string substr(int pos, int n); // 返回串pos位置开始,长度为n的子串
2.3 字符串比较函数
int compare(const char* s); // 比较原串和 - 3 - s
int compare(int p0, int n, const char* s); // 比较串中p0开始,n个字符的子串和s
2.4 数据访问函数
char& operator[](int i); // 返回串中第i个字符的引用
const char& operator[](int i) const; // 返回串中第i个字符的引用
const char* c_str() const; // 返回字符串以null结尾的字符串
2.5 输入输出函数
ostream& operator<<(ostream& os, const string& str); //
输出字符串
istream& operator>>(istream& is, string& str); //
输入字符串。
String类的常用方法
String类的常用方法
1.public String concat(String str) 将指定字符串连接到此字符串的结尾。
如果参数字符串的长度为 0,则返回此 String 对象。否则,创建一个新的 String 对象,用来表示由此 String 对象表示的字符序列和参数字符串表示的字符序列连接而成的字符序列。
例如:
public class Test1{
public static void main(String [] args){
String s="abc";
String a="123";
System.out.println(a);
a=a.concat(s);
System.out.println(a);
}
}
运行结果:
2.public String replace(CharSequence target,CharSequence replacement)
返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。
如果 oldChar 在此 String 对象表示的字符序列中没有出现,则返回对此 String 对象的引用。否则,创建一个新的 String 对象,它所表示的字符序列除了所有的 oldChar 都被替换为 newChar 之外,与此 String 对象表示的字符序列相同。
例如:
public class Test2{
public static void main(String [] args){
String e1="hahahaha";
System.out.println(e1);
e1=e1.replace('a', 'e');
System.out.println(e1);
}
}
运行结果:
3.public boolean contains(CharSequence s)
C++课程设计String类
#include
#include
#include
#include
#define Base 10000
#define M 1000
/*初始长度为Base,以后依次增加M*/
using namespace std;
class String
{
private:
char *str; ///str为指针,len为长度,size为能容纳的最大字符数
int len,size;
public:
///构造函数,能直接确定长度,或者用一个字符串初始化
String (int maxsize=Base);
String (const char *s);
char *c_str() { return str; } ///返回一个指向字符串头部的C语言的指针
String insert(int pos,const char c); ///在pos位置插入字符c
String insert(int pos,String s); ///在pos位置插入String s
String insert(int pos,const char *s); ///插入字符串
String Delete(int pos); ///删除pos位置的字符
String Delete(int start,int end); ///删除区间内的字符
String Delete(char c); ///删除所有的c字符
int copy(char *s,int num,int start); ///从start开始复制num个字符到str中
int search(char c); ///返回第一个出现字符c的位置
C++string方法
string类的构造函数:
string(const char *s); //用c字符串s初始化
string(int n,char c); //用n个字符c初始化
此外,string类还支持默认构造函数和复制构造函数,如string s1;string s2="hello";都是正确的写法。当构造的string太长而无法表达时会抛出length_error异常
string类的字符操作:
const char &operator[](int n)const;
const char &at(int n)const;
char &operator[](int n);
char &at(int n);
operator[]和at()均返回当前字符串中第n个字符的位置,但at函数提供范围检查,当越界时会抛出out_of_range异常,下标运算符[]不提供检查访问。
const char *data()const;//返回一个非null终止的c字符数组
const char *c_str()const;//返回一个以null终止的c字符串
int copy(char *s, int n, int pos = 0) const;//把当前串中以pos开始的n个字符拷贝到以s为起始位置的字符数组中,返回实际拷贝的数目
string的特性描述:
int capacity()const; //返回当前容量(即string中不必增加内存即可存放的元素个数)
int max_size()const; //返回string对象中可存放的最大字符串的长度
int size()const; //返回当前字符串的大小
int length()const; //返回当前字符串的长度
bool empty()const; //当前字符串是否为空
void resize(int len,char c);//把字符串当前大小置为len,并用字符c填充不足的部分
c++简单String类实现
c++简单String类实现
#include
#include
using namespace std;
class String
{
public:
String(const char* str = NULL);//通⽤构造函数,String("abc")
String(const String &str);//拷贝构造
~String();
String& operator=(const String &str);//赋值运算符。返回引⽤
String operator+(const String &str) const;
String& operator+=(const String &str);//+=操作符。返回引⽤
char& operator[](int n) const;//下标操作符。返回引⽤
bool operator==(const String &str) const;
int size() const;//字符串实际⼤⼩,不包括结束符
const char *c_str() const;//将string转为char *
private:
char *data;
int length;
};
String::String(const char* str)//通⽤构造
{
if (!str)
{//为空。String a()
length = 0;
data = new char[1];
*data = '\0';
}
else
{
length = strlen(str);
data = new char[length + 1];
strcpy(data, str);//会拷贝源的结束符
}
}
String::String(const String &str)//拷贝构造,深拷贝
{
length = str.size();
data = new char[length + 1];
strcpy(data, str.c_str());
StringBuffer类常用方法
StringBuffer类常⽤⽅法
StringBuffer类概述
1)我们如果对字符串进⾏拼接操作,每次拼接,都会构建⼀个新的String对象,既耗时,⼜浪费空间。⽽StringBuffer就可以解决这个问
题
2)线程安全的可变字符序列
3)StringBuffer和String的区别
前者长度和内容可变,后者不可变。
· 如果使⽤前者做字符串的拼接,不会浪费太多的资源。
构造⽅法
· public StringBuffer() :⽆参构造⽅法
· public StringBuffer(int capacity) :指定容量的字符串缓冲区对象
· public StringBuffer(String str) :指定字符串内容的字符串缓冲区对象
StringBuffer的⽅法:
public int capacity():返回当前容量,理论值
public int length():返回长度(字符数) ,实际值
package com.stringbuffer;
public class TestStringBufffer {
public static void main(String[] args) {
//StringBuffer构造⽅法1
StringBuffer sb1=new StringBuffer("Hello");
System.out.println(sb1);
String s1="World";
//StringBuffer构造⽅法2
StringBuffer sb2=new StringBuffer(s1);
System.out.println(sb2);
//length()返回字符串的长度
System.out.println(sb2.length());
//toString()这个⽅法重写了Object中的toString()⽅法,返回String类型的字符串
//输出StringBuffer对象时候,会默认调⽤此⽅法
StringBuffer类的常用方法
StringBuffer类的常⽤⽅法
⼀、创建StringBuffer类
1.
StringBuffer 是线程安全 ( 耗费资源) 的 可变序列
StringBuilder 是 线程不安全(不耗费资源)的 可变序列
2.
创建⼀个新的StringBuffer对象⼀定要⽤到new⽅法,不能和string⼀样直接引⽤字符串常量
1 private static void fun1() {
2 // 构造⽅法初始化StringBuffer
3 StringBuffer sb = new StringBuffer();
4 // 打印当前的容量(理论值)
5 System.out.println(sb.capacity());// 16
6 // 打印长度(实际值)
7 System.out.println(sb.length());// 0
8 // 打印内容
9 System.out.println(sb.toString());
3.1 添加 append():
append(可以添加多种类型 包括基本数据类型);
例如:String、int、double、Boolean等,都可以转变成字符串表⽰形式。
1 private static void fun1() {
2 // StringBufferr 的长度是可以变的
3 // 对StringBufferr操作的时候 改变的是其本⾝
4 StringBuffer sb1 = new StringBuffer();
5 System.out.println(sb1);
6
7 sb1.append("wukong").append("z").append("n");
8 sb1.append("z");
9 sb1.append("n");
10
11 System.out.println(sb1);
3.2 插⼊insert():
setCharAt(int index , char ch)⽅法
标准C++类string的Copy
标准C++类string的Copy
标准C++类string的Copy-On-Write技术(3)
分类: C++ 2010-08-04 13:15 93人阅读 评论(0) 收藏 举报
目录(?)[+]
2.3.4、 Copy-On-Write的具体实现是怎么样的?
最后的这个问题,我们主要解决的是那个“民主集中”的难题。请先看下面的代码:
string h1 = “hello”;
string h2= h1;
string h3;
h3 = h2;
string w1 = “world”;
string w2(“”);
w2=w1;
很明显,我们要让h1、h2、h3共享同一块内存,让w1、w2共享同一块内存。因为,在h1、h2、h3中,我们要维护一个引用计数,在w1、w2中我们又要维护一个引用计数。
如何使用一个巧妙的方法产生这两个引用计数呢?我们想到了string类 的内存是在堆上动态分配的,既然共享内存的各个类指向的是同一个内存区,我们为什么不在这块区上多分配一点空间来存放这个引用计数呢?这样一来,所有共享 一块内存区的类都有同样的一个引用计数,而这个变量的地址既然是在共享区上的,那么所有共享这块内存的类都可以访问到,也就知道这块内存的引用者有多少 了。
请看下图:
于是,有了这样一个机制,每当我们为string分配内存时,我们总是要多分配一个空间用来存放这个引用计数的值,只要发生拷贝构造可是赋值时,这个内存的值就会加一。而在内容修改时,string类为查看这个引用计数是否为0,如果不为零,表示有人在共享这块内存,那么自己需要先做一份拷贝,然后把引用计数减去一,再把数据拷贝过来。下面的几个程序片段说明了这两个动作:
//构造函数(分存内存)
string::string(const char* tmp)
{
_Len = strlen(tmp);
c++ string类详解
C++中针对C语言中处理字符串的难题,在标准库中设计了string类,因此现在编程中涉及到字符串的处理,就可以直接使用string类了。
之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必担心内存是否足够、字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下(甚至是100%)的需要。我们可以用=进行赋值操作,==进行比较,+做串联(是不是很简单?)。我们尽可以把它看成是C++的基本数据类型。
首先,为了在我们的程序中使用string类型,我们必须包含头文件。如下:
#include//注意这里不是string.hstring.h是C字符串头文件
1.声明一个C++字符串
声明一个字符串变量很简单:
stringStr;
这样我们就声明了一个字符串变量,但既然是一个类,就有构造函数和析构函数。上面的声明没有传入参数,所以就直接使用了string的默认的构造函数,这个函数所作的就是把Str初始化为一个空字符串。String类的构造函数和析构函数如下:
a)strings;//生成一个空字符串s
b)strings(str)//拷贝构造函数生成str的复制品
c)strings(str,stridx)//将字符串str内“始于位置stridx”的部分当作字符串的初值
d)strings(str,stridx,strlen)//将字符串str内“始于stridx且长度顶多strlen”的部分作为字符串的初值
e)strings(cstr)//将C字符串作为s的初值
f)strings(chars,chars_len)//将C字符串前chars_len个字符作为字符串s的初值。g)strings(num,c)//生成一个字符串,包含num个c字符
h)strings(beg,end)//以区间beg;end(不包含end)内的字符作为字符串s的初值
i)s.~string()//销毁所有字符,释放内存
C++ string类常用函数
C++ string类常用函数 #include using namespace std;
构造函数:
string(const char *s); //用c字符串s初始化
string(int n, char c); //用n个字符c初始化
此外,string类还支持默认构造函数和复制构造函数,如string s1;string
s2="hello";都是正确的写法。当构造的string太长而无法表达时会抛出
length_error异常
字符操作: const char &operator[](int n)const; const char &at(int n)const; char &operator[](int n); char &at(int n);
注:operator[]和at()均返回当前字符串中第n个字符的位置,但at函数
提供范围检查,当越界时会抛出out_of_range异常,下标运算符[]不提供检
查访问。
const char *data()const; //返回一个非
null终止的c字符数组
const char *c_str()const; //返回一个以
null终止的c字符串
int copy(char *s, int n, int pos = 0) const; //把当前串中以
pos开始的n个字符拷贝到以s为
//起始位置的字符数组中,返回实际拷贝的数目
特性描述:
int capacity()const; //返回当前容量(即string中不必增
加内存即可存放的元素个数)
int max_size()const; //返回string对象中可存放的最大字
符串的长度
int size()const; //返回当前字符串的大小
int length()const; //返回当前字符串的长度
bool empty()const; //当前字符串是否为空
void resize(int len,char c); //把字符串当前大小置为len,并用字
C++ 实现String类
山东科技大学
《面向对象程序设计》
姓 名:
学 号:
班 级:
成 绩:
信息科学与工程学院
年 月 日
- 2 - 一、 需求陈述
在用C++语言编程过程中,可以使用数组来存放字符串,但每次都需要调用系统函数,当字符串长度很不确定时,需要用new来动态创建数组,最后还要用delete释放,这些都相当繁琐。而且数据与处理数据的函数分离也不符合面向对象方法的要求。因此,需要对这些繁琐的操作进行封装,形成String类,使对字符串的操作更加方便。
二、需求分析
1、功能需求
常用的字符串操作:
(1)、将两个字符连接为一个字符串;
(2)、在一个字符串中插入一个子串;
(3)、比较两个字符串的大小;
(4)、从一个字符串中查找一个子串;
(5)、求字符串的长度;
(6)、交换两个字符串;
(7)、将字符串倒序。
2、数据需求
(1)、数据录入和处理的准确性与容错性
数据输入的准确性是系统处理数据的前提。为避免不合理的数据的输入或错误的操作,就要求系统在数据输入时给出准确的提示,并具备一定的害错能力。
(2)、数据的一致性与完整性
由于库函数的数据是共享的,所以必须保证这些数据具有一致性与完整性。为解决这一问题,就要求管理员对数据进行及时维护。
(3)、技术约束
此程序已在Code Blocks 10.05 下编译通过。
三、设计思路
1、String类总体结构设计 - 3 -
首先定义一个String类,定义多个构造函数,使用不同的方法对对象进行初始化。然后调用构造函数实现运算符重载,再在两者基础上实现成员函数的功能。
2、界面设计
设计两个菜单,一级菜单为欢迎界面,二级菜单为功能测试界面。程序执行后直接进入欢迎界面,然后根据选择提示进入功能测试界面,可根据选择提示程序进行功能测试。
3、多文件结构
