【c++string】string三种遍历,reserve和resize的区别

  • Post author:
  • Post category:其他



目录


1.学习string,大多数的时候需要我们去看文档,推荐strtok – C++ Reference (cplusplus.com)


2.string的三种遍历方式


3.resize和reserve的区别


1.学习string,大多数的时候需要我们去看文档,推荐

strtok – C++ Reference (cplusplus.com)

在搜索栏内搜索string即可

查找我们需要的即可

2.string的三种遍历方式


1.下标+方括号(就像访问数组,仅仅string能使用)

int main()
{
	string s2("hello wrold");
	//3种遍历方式
	//1.下标+[]
	for (size_t i = 0; i < s2.size(); ++i)
	{
		cout << s2[i] << " ";
	}
    return 0;
}


2.迭代器(迭代器有点类似指针,所有的容器(list,heap等等)都可以使用)

int main()
{
    //2.迭代器
	//[begin(),end())end()返回的不是最后一个数据位置的迭代器,返回的是最后一个位置下一个位置
	//也要注意的是,c++中凡是给迭代器一般都是给的{)左闭右开的区间
	//迭代器是类似指针一样的东西\
    string s2("hello wrold");
	string::iterator it = s2.begin();
	while (it != s2.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;

    return 0;
}

反向迭代器

int main()
{
    	反向迭代器
    string s4("654321");
	string::reverse_iterator rit = s4.rbegin();
	while (rit != s4.rend())
	{
		*rit += 1;
		cout << *rit << " ";
		rit++;
	}
}


3.范围for(c++11的标准,代码可读性高)

int main()
{
    	//c++11,3.范围for
	//依次取容器的值赋给e,自动判断结束
    string s2("hello wrold");
	for (auto e : s2)
	{
		//e+=1;//需要引用,即for (auto& e : s2)
		cout << e << " ";
	}
	cout << endl;
	return 0;
}

3.resize和reserve的区别


1 resize:改变size

  • 增加size,

    容量不够会扩容

    ;没有第二个参数使用‘\0’,有则使用对应的
  • 减少size,容量不会被改变;不会把‘\0’填入

int main()
{
	string s2("hello wrold");
	cout << "size:" << s2.size() << endl;
	cout << "capacity:" << s2.capacity() << endl;
	cout << s2 << endl;
	
	//没有pos默认'\0'
	s2.resize(20);//改变size,如果容量不够会扩容
	cout << "size:" << s2.size() << endl;
	cout << "capacity:" << s2.capacity() << endl;
	cout << s2 << endl;

	s2.resize(5,'x');//缩小,不会改变容量,也不会把‘x’填入
	cout << "size:" << s2.size() << endl;
	cout << "capacity:" << s2.capacity() << endl;
	cout << s2 << endl;
    return 0;
}


2 reserve:

  • 增加容量,不会改变size;
int main()
{
	string s2("hello wrold");
	cout << "size:" << s2.size() << endl;
	cout << "capacity:" << s2.capacity() << endl;
	cout << s2 << endl;


	string s3("hello world");
	s3.reserve(50);
	cout << "size:" << s3.size() << endl;
	cout << "capacity:" << s3.capacity() << endl;
	cout << s3 << endl;
    return 0;
}


3.为什么使用reserve增容,而不是resize呢?


原因:


  1. resize在改变容量时,size也会改变,(resize时改变size会填入‘\0’或者我们输入的字符,后面还是会再次增容)

  2. reserve只会改变容量;
int main()
{
	string s4;
	s4.reserve(127);//先增容解决
	//s4.resize(127);//改变容量的同是也改变size,后续还是会增容
	size_t chOld = s4.capacity();
	for (int ch = 0; ch < 127; ch++)
	{
		//多次增容效率低
		if (chOld != s4.capacity())
		{
			cout << "增容" << chOld << "->" << s4.capacity()<<endl;
			chOld = s4.capacity();
		}
		s4 += ch;
	}
	cout << s4 << endl;
	return 0;
}



版权声明:本文为m0_72964546原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。