【C++】string 之 assign、at、append函数的学习

前言

在学习string类的过程中,我发现了assign这个函数,感觉很有用,就来记录一下

assign函数原型:

void assign(size_type n, const T& x = T());

void assign(const_iterator first, const_iterator last);

assign函数有两种使用方式:

第一种:容器名.assign (a, b);

容器名.assign (a, b);

将vector中的内容清空,并给予a个b元素

下面给出一个例子:

#include<iostream>
#include<vector>
using namespace std;

int main()
{
	vector<int>v1{ 1,2,3 };
	//创建一个容器v1 元素类型是int 有三个元素

	v1.assign(2, 5);
	
	for (int val : v1)
	{
		cout << val << endl;
	}

	cout << "--------------------" << endl;

	v1.assign(4, 5);

	for (int val : v1)
	{
		cout << val << endl;
	}

	cout << "--------------------" << endl;

	int a = 2;
	int b = 3;
	int n = a * b;
	int x;
	v1.assign(n, x);
	for (int val : v1)
	{
		cout << val << endl;
	}

	cout << "--------------------" << endl;

	return 0;
}

通过上面这个例子,我们可以发现,首先,在传入新的元素之前,assign函数会先清空vector中的内容,之后,再传入新的数据,并且,无论是传入一个变量,还是传入未初始化的变量,都可以实现assign的功能

注意:第一个元素,即要传入的元素个数不能是未初始化的变量,不然程序会报错

第二种:容器名2.assign(容器名1.begin(),容器名1.end());

容器名2.assign(容器名1.begin(),容器名1.end());

提示:
这种使用方法的含义就是:
将容器1中的begin()和end()之间的元素放到容器2中,包含起始位置和终止位置。同样的,也是先清空容器2中的内容

下面给出一个例子:

#include<iostream>
#include<vector>

using namespace std;

int main()
{
	vector<int>v1{ 1,2,3 };
	vector<int>v2{ 1,2 };

	v2.assign(v1.begin(), v1.end());

	for (int val : v2)
	{
		cout << val << endl;
	}

	cout << "--------------" << endl;

	v2.assign(v1.begin() + 1, v1.end() - 1);

	for (int val : v2)
	{
		cout << val << endl;
	}

	cout << "--------------" << endl;

	return 0;
}

通过上面这些例子,相信我们就可以基本明白assign是如何使用的了

at函数

函数源码

vector<_Tp, _Allocator>::at(size_type __n)
{
	if (__n >= size())
		this->__throw_out_of_range();
	return this->__begin_[__n];
}

了解即可,不用深究

at函数的使用

arr[3]与arr.at(3)的效果是一样的,只是使用at函数,不会发生越界访问的情况,更加安全

举个例子:

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

int main()
{
	vector<int>arr{ 1,2,3,4,5 };

	for (int i = 0; i < arr.size(); i++)
	{
		cout << arr.at(i) << endl;
	}

	//cout << arr.at(5) << endl;
	return 0;
}

运行结果:
在这里插入图片描述
相信通过上面的学习,我们已经明白了如何使用at函数

append函数

接下来,我们来学习append函数

用法1:完全复制

格式:

append函数的使用格式:

字符串1.append(字符串2);

例子:

下面,举一个例子,方便大家理解:

#include<iostream>

using namespace std;

int main()
{
	string a = "qaz";
	string b = "wsx";
	string c = "edc";
	cout << a << endl;

	a.append(b);

	cout << a << endl;

	a.append(b + c);

	cout << a;

	return 0;
}

运行结果:
在这里插入图片描述
通过上面这个例子,我们可以知道虽然append函数一次只能复制一个字符串,但这个字符串是可以先运算的,比如:b+c

用法2:部分复制(后面的字符)

append除了复制全部内容以外,还可以选取部分进行复制

格式:

使用格式:

字符串1.append(字符串2,起始位置index,复制元素个数n);

作用:
将字符串2中第index个位置开始(包含起始位置的元素),共n个元素,拷贝到字符串1的末尾

例子:

下面给出一段代码,方便大家理解:

#include<iostream>

using std::string;
using std::cout;
using std::endl;

int main()
{
	string a = "hello";
	string b = "world";
	cout << a << endl;

	a.append(b, 2, 3);

	cout << a << endl;

	return 0;
}

运行结果:
在这里插入图片描述
特别的:
当只传入起始位置index,而不传入复制元素个数n的时候,编译器默认拷贝到字符串末尾

用法3:部分复制(前面的字符)

格式:

字符串1.append(C语言风格的字符串2,复制元素的个数n);

将字符串2中从开始位置算起,共复制n个元素放到字符串1的末尾

例子:

#include<iostream>

using namespace std;

int main()
{
	string a = "hello";
	const char* b = "world";

	a.append(b, 3);

	cout << a << endl;

	return 0;
}

运行结果:
在这里插入图片描述

注意:

直接传入字符串的时候,编译器默认它是C语言风格的字符串

例子如下:

#include<iostream>

using namespace std;

int main()
{
	string a = "hello";
	a.append("world", 5);

	cout << a << endl;

	return 0;
}

在这里插入图片描述

用法4:复制相同字符

格式:

字符串1.append(复制字符的个数n,复制的字符ch);

作用:
将n个ch复制到字符串1的后面

例子:

#include<iostream>

using namespace std;

int main()
{
	string a = "hello";

	char c = '!';

	a.append(3, c);

	cout << a << endl;

	int n = 4;

	a.append(n, 'h');

	cout << a << endl;

	return 0;
}

运行结果:
在这里插入图片描述

结语

对于assign、at和append函数的学习和介绍到这里就结束了,希望这篇文章对你有帮助,我们下次见~

  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
目录 1 正文 3 一、 C++string的使用 3 1.1 C++ string简介 3 1.2 string的成员 3 1.2.1 append 3 1.2.2 assign 4 1.2.3 at 4 1.2.4 begin 5 1.2.5 c_str 5 1.2.6 capacity 5 1.2.7 clear 6 1.2.8 compare 6 1.2.9 copy 6 1.2.10 _Copy_s 6 1.2.11 data 6 1.2.12 empty 6 1.2.13 end 6 1.2.14 erase 6 1.2.15 find 6 1.2.16 find_first_not_of 7 1.2.17 find_first_of 8 1.2.18 find_last_not_of 8 1.2.19 find_last_of 8 1.2.20 get_allocator 8 1.2.21 insert 8 1.2.22 length 8 1.2.23 max_size 8 1.2.24 push_back 8 1.2.25 rbegin 8 1.2.26 rend 8 1.2.27 replace 8 1.2.28 reserve 10 1.2.29 resize 11 1.2.30 rfind 11 1.2.31 size 11 1.2.32 substr 11 1.2.33 swap 11 1.3 string的构造 11 1.4 string的重载运算符 12 1.5 string与algorithm相结合的使用 12 1.5.1 string与remove 12 1.5.2 string与unique、sort 12 1.5.3 string与search 12 1.5.4 string和find、find_if 13 1.5.5 string与copy、copy_if 13 1.5.6 string与count、count_if 14 1.6 string与wstring 14 1.6.1 简介 14 1.6.2 wstring实例 15 1.6.3 wstring与控制台 15 1.6.4 string与wstring的相互转换 16 1.7 stringC++流 21 1.7.1 C++流简介 21 1.7.2 string与iostream、fstream 21 1.8 格式化字符串 22 1.8.1 简单常用的C方法 22 1.8.2 boost的方法 22 1.9 string与CString 23 二、 boost字符串算法库 23 2.1 boost字符串算法库导论 23 2.1.1 boost.algorithm.string是什么? 23 2.1.2 相关 23 2.1.3 boost.range导论 23 2.1.4 boost.regex导论 23 2.1.5 boost.algorithm.string的DNA 24 2.2 boost字符串算法解密 24 2.2.1 修剪(trim.hpp) 24 2.2.2 转换(case_conv.hpp) 26 2.2.3 判断式、断言函数(predicate.hpp)【Predicates】 27 2.2.4 查找 28 2.2.5 删除和替换 29 2.2.6 分割和组合 31 2.2.7 其它 32 三、 C字符串 32 3.1 C字符串常用算法 32 3.1.1 strcpy wcscpy 32 3.1.2 strcat wcscat 32 3.1.3 strchr wcschr 32 3.1.4 strcmp wcscmp 33 3.1.5 stricmp wcsicmp 33 3.1.6 strlen wcslen 33 3.1.7 strlwr/_strlwr wcslwr/_wcslwr 33 3.1.8 strncat wcsncat 33 3.1.9 strcspn wcscspn 33 3.1.10 strdup/_strdup wcsdup/_wcsdup 34 3.1.11 strncpy wcsncpy 34 3.1.12 strpbrk wcspbrk 35 3.1.13 strrev/_strrev wcsrev/_wcsrev 35 3.1.14 strset/_strset/_strset_l wcsset/_wcsset/_wcsset_l 35 3.1.15 strstr/wcsstr 35 3.1.16 strtok/wcstok 36 3.1.17 strupr/_strupr wcsupr/_wcsupr 36 3.2 更安全的C字符串函数 36 3.2.1 简述 36 3.2.2 简单实例 36 3.2.3 定制 38 3.2.4 兼容 41 3.3 通用字串函数 47 3.3.1 简述 47 3.3.2 简单实例 47 3.3.3 映射表 48 3.4 API级的字符串处理 48 3.4.1 简述 48 3.4.2 旧的API 48 3.4.3 Shell字符串函数 48 3.4.4 新的安全版字符串处理API 48 四、 C++字符串使用的建议 51 附录1:参考资料: 51 附录2: MSSTL中basic_string的部分源码解读 51 2.1 string的allocator 51 2.1.1 Allocate和Deallocate 51 2.1.2 allocator的泛型实现 52 2.1.3 string与char_traits 54 2.1.4 以char和wchar_t特化char_traits 56 附录3:Boost.Format中文文档 57 2.1 大纲 57 2.2 它是如何工作的 57 2.3语法 58 2.3.1 boost::format( format-string ) % arg1 % arg2 % ... % argN 58 2.3.2 printf 格式化规则 59 2.3.3 新的格式规则 60 附录4 TCHAR.h 映射表 60

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值