C++ 中 string 的常用用法和 迭代器详解

string的常用用法

    1. 字符串的初始化
    
    string s(5,'w');  // 初始化 s 为  wwwww
    //string s('w') 和 string s(5,"hello") 都是错误的
	string s1("hello");   //初始化 s1  为 hello
	string s2 = s1; //拷贝构造s2
	string s3(s2, 2);  // 从第二个位置开始拷贝后面的所有字符,包括第二位
 	string s4(s2, 1, 3);  // 从第一个位置开始向后拷贝3个字符,包括第一位
 	//注意: s1 中的 h 就是第0个位置
 	
 	2. 运算符重载
 	
 	1>  "+="   重载
 	s1 += 'a';
 	s1 += " world";  //sting 的运算符重载,在 s1 的末尾进行添加,可以加字符或者一个字符串
 	其他的几种添加方式
 	s1.push_back('w'); // 在 s1 的末尾进行添加,但是只能加一个字符
 	s1.append(" world");//在 s1 的末尾进行添加, 但是只能添加字符串
 	s1.insert(5," world");// 在 s1 的第5位添加, "hello world"
 	s1.insert(6, "the"); // 在第6位进行添加, "hello theworld"
 	s1.insert(6,s2); // 在第6位添加字符串 s2 的内容
 	// insert 一般用来在字符串的中间位置进行添加
 	
 	2>  "="  重载
 	s1 = "nihao";  //将字符串的内容改为 nihao
 	
    3>  "[]" 重载
    for (size_t i = 0; i < s.size(); ++i)
	{
		cout << s[i] << " ";  // s[i] 为字符串中对应 i 处的字符
	}
	cout << endl;
 	
 	4>  "+"  重载
 	string s("hello");
	string s1(" world");
	string s2;
	s2 = s + s1;
    
    3. 几个常用用法
   
   <1> 获取常用内容 
    string s1("hello world");
    s1.size(); // 获取s1的字符串长度
 	s1.length(); //同 size 功能一致
 	s1.capacity(); // 查看 s1 所占空间数目,当此容量耗尽且需要更多容量时,它会被对象自动扩展(重新分配它的存储空间)
 	s1.clear(); //清除 s1 中的所有内容,但是不会释放 s1 的空间
 	 
 	 <2> 返回地址
    s1.data(); //返回一个指向正规字符串的指针常量, 内容与 s1 字符串相同。
    s1.c_str(); //功能和返回值同上
    // data 和 c_str 基本可以认为是用一个函数,返回值也都是 const char* ,所以使用的时候要注意
    // 错误方式:
       char *p;  // 改成 const char *p 就可以避免
       string s("hello");
       p = s.data();  // 因为返回值是 const char* 所以不能传给 char
       //但这样也是存在缺陷的, s 作为对象生命周期结束后会被析构,到时候 p 指向的就是非法内容
     // 正确方式:
       char dst[20];
       string s("hello");
       strcpy(dst,s.data()); //用 c_str 也一样
       // 这样即使 s 被析构之后也不会出现其他问题
       
    <3> 字符串内容删除
 	s1.erase(6,5); // 从字符串的第6位开始向后删除包括第6位在内的5个字符
 	s1.erase(6)// 删除第六位字符
 	
 	<4>开辟空间
 	s1.reserve(100); // 给 s1 分配100个空间,但是并不会改变字符串的原始长度,其实会多开一个来存 \0
 	s1.resize(100); // 给 s1 分配100个空间,并且将字符串增添到100,没有设置则自动补 '0'
 	s1.resize(100,'x'); //设置后会补 x
  
  	<5> 字符串内容拷贝
  	size_t copy (char* s, size_t len, size_t pos = 0) const;
  	
  	string s("hello");
	char buffer[20];  // char *buffer = new char[20];
	size_t len = s.copy(buffer, 5, 0);  //s是去拷贝过去的地方的首地址,必须保证空间足够,len是需要拷贝的字符串长度,pos是拷贝的起始位置(字符串中的第一个字符是0(而不是1))
	//返回值是实际拷贝过去的字符长度
	buffer[len] = '\0'; // 拷贝后系统不会添加 \0, 所以要自己添加

	<6> 字符串内容替换
	string& replace (size_t pos,size_t len,const string& str);
	string& replace (const_iterator i1, const_iterator i2, const string& str);
	//第二种是传迭代器,其实都一样

	string s1 = "Hello Wold!";
	string s2 = "World!";
	s1.replace(6,5,s2); //用s2替换s1中从第6位开始向后的5个字符内容
	//下面这种情况,是用s2替换s1中从第0位开始往后的所有内容
	s1.replace(0,-1,s2); //-1 == npos,这代表所以

	//迭代器用法
	string s1 = "This is a test1";
	string s2 = "This is a test1";
	s1.relpace(s1.begin(),s1.end(),s2); //用s2全部替换s1,因为C++左闭右开< [begin,end) > 的特性,这里的end其实是end+1,好比共10个元素,end指的是第11个元素的位置,这样就能包含全部元素了

想要了解更多更具体的 string 用法建议登陆下面的这个网站:

C/C++ 库函数官网

迭代器

  1. 迭代器不是指针,是类模板,表现的像指针。他只是模拟了指针的一些功能,通过重载了指针的一些操作符,->,*,++ --等封装了指针,是一个“可遍历 STL 容器内全部或部分元素”的对象, 本质是封装了原生指针,是指针概念的一种提升(lift),提供了比指针更高级的行为,相当于一种智能指针,他可以根据不同类型的数据结构来实现不同的++,–等操作;
  2. 迭代器返回的是对象引用而不是对象的值,所以cout只能输出迭代器使用取值后的值而不能直接输出其自身。
  3. 在设计模式中有一种模式叫迭代器模式,简单来说就是提供一种方法,在不需要暴露某个容器的内部表现形式情况下,使之能依次访问该容器中的各个元素,这种设计思维在STL中得到了广泛的应用,是STL的关键所在,通过迭代器,容器和算法可以有机的粘合在一起,只要对算法给予不同的迭代器,就可以对不同容器进行相同的操作。

注意:dei迭代器在使用后就会被系统释放,不能再继续使用,但是指针却可以继续使用。

指针:
指针能指向函数而迭代器不行,迭代器只能指向容器;指针是迭代器的一种。指针只能用于某些特定的容器;迭代器是指针的抽象和泛化。所以,指针满足迭代器的一切要求。

void String1() // 正向迭代器
{
	string s1("hello");
	s1 += " world";    //这里是 += 的重载,可以加一个字符串、字符、对象
	//auto it = s1.begin(); 也能使用 auto
	string::iterator it = s1.begin();  // 正向迭代器,正向遍历
	// s1.begin() 是字符串的起始字符 'h'
	// s1.end() 是字符串的末尾位置的后一位 '\0'
	while (it != s1.end())
	{
		cout << *it << " "; // 这里不是指针,只是具有指针的功能, *it 就是它的内容
		++it;
	}
	cout << endl;
	cout << *it << endl; //这里再次使用 *it 就会崩溃,因为迭代器在使用后就会被系统释放,不能再继续使用
}

void String2() //反向迭代器
{
	string s1("hello world");
	//auto rit = s1.rbegin();  //也可用auto
	string::reverse_iterator rit = s1.rbegin();  //反向迭代器,倒着遍历
	while (rit != s1.rend())
	{
		cout << *rit << " ";
		++rit;
	}
	cout << endl;
}
void String3() // const 正向迭代器, 只能读数据不能修改数据
{
	string s1("hello world");
	string::const_iterator cit = s1.begin(); //正向遍历
	while (cit != s1.end())
	{
		cout << *cit << " ";
		++cit;
	}
}
void String4() // const 反向迭代器
{
	string s1("hello world");
	string::const_reverse_iterator rcit = s1.rbegin();  //反向
	while (rcit != s1.rend())
	{
		cout << *rcit << " ";
		++rcit;
	}
	cout << endl;
}

你可能感兴趣的:(C++)