c++ vector 赋值 只能用push_back()赋值 ?使用下标赋值出错,不能使用标赋值吗?

发布时间:2024年01月24日

1 push_back()赋值

vector<int> v;此时vector为空, size为0,表明容器中没有元素,而且 capacity 也返回 0,意味着还没有分配内存空间
这种初始化方式适用于元素个数未知,需要在程序中动态添加的情况 push_back()

push_back()是在vector尾部动态追加

int main()
{
	vector<int> v;
	v.push_back(1);

	cout << v[0] << " " << endl;

	return 0;
}

在这里插入图片描述

2 下标赋值

2.1 下标赋值出错

int main()
{
	vector<int> v;
	v[0] = 1;
	cout << v[0] << " " << endl;

	return 0;
}

报错 “vector subscript out of range”,下标超出范围;

问题在于“v[0] = 1”一句,
一开始vector为空时,因为还没有分配内存空间。使用下标赋值 运行会出现内存非法操作的错误。
在这里插入图片描述

在这里插入图片描述

2.2 vector 真的 不能使用标赋值吗?

vector 真的 不能使用标赋值吗?并不是

分析下表出错原因:
vector<int> v;此时vector为空, size为0,一开始vector为空时,因为还没有分配内存空间。使用下标赋值 运行会出现内存非法操作的错误。

2.2.1 只能使用push_back() 赋值情况

1 默认初始化,无参(没给定数组大小)

 vector<int> res;//默认初始化

vector为空, size为0,表明容器中没有元素,而且 capacity 也返回 0,意味着还没有分配内存空间
这种初始化方式适用于元素个数未知,需要在程序中动态添加的情况;

添加元素,只能用.push_back();

for (int i = 10; i < 18; i++)
	res.push_back(i);

下面 下标赋值错误,因为还没有分配内存空间。

2.2.2 push_back() 和 下标赋值 都可以

2 带参数构造初始化 (给定数组大小、初始值)

vector<int> res(8);

res中将包含8个元素,每个元素进行缺省的值初始化,对于int,也就是被赋值为0,因此res被初始化为包含8个0。

等同于

vector<int> res(80);

指定值初始化,ilist5被初始化为包含7个值为3的int。

vector<int> ilist5(7,3);

添加元素,可用res[i] = a;也可.push_back(a);

for (int i = 0; i < 8; i++)
	res.push_back(i);
for (int i = 0; i < 8; i++)
	res[i] = i;

2.2.3 先push_back()赋值,再下标赋值

//先通过 push_back()赋值,使vector不为空时分配内存空间;再进行下标赋值

int main()
{
	//先通过 push_back()赋值,使vector不为空时分配内存空间;再进行下标赋值
	vector<int> v;
	v.push_back(1);
	
	for (int i = 0; i < 8; i++)
		v[i] = i;

	for (int i = 0; i < v.size(); i++)
		cout << v[i] << endl;

	return 0;
}

失败,
和直接下标赋值效果一样的
在这里插入图片描述

2.3 push_back() 和 下标赋值 两种特点对比测试

//定义数组
	vector<int> res(8);
	cout << "res.size() = " << res.size() << endl;
	//给数组重新赋值
	for (int i = 0; i < 8; i++)
		res[i] = i;
	//输出
	for (int i = 0; i < res.size(); i++)
		cout << res[i] << endl;
	cout << "res.size() = " << res.size() << endl;

在这里插入图片描述

//定义数组
	vector<int> res(8);
	cout << "res.size() = " << res.size() << endl;
	//给数组重新赋值
	for (int i = 0; i < 8; i++)
		res.push_back(i);
	//输出
	for (int i = 0; i < res.size(); i++)
		cout << res[i] << endl;
	cout << "res.size() = " << res.size() << endl;

在这里插入图片描述

3 vector初始化赋值方法

vector赋值有多种方法,可以使用初始化列表、构造函数、拷贝构造函数、直接赋值、迭代器赋值、移动赋值等方式。其中,初始化列表方式最为常用。

	vector<int> v1 = { 1, 2, 3 };  // 初始化列表
	vector<int> v2(5);  // 元素个数为5
	vector<int> v3(5, 1);  // 元素个数为5,每个元素的初值为1
	vector<int> v4(v3);  // 拷贝v3
	vector<int> v5(v1.begin(), v1.end());  // 拷贝v1的元素
	vector<int> v6 = v4;  // 拷贝v4

3.1 直接赋值

vector v1 = {1, 2, 3};
vector v2 = v1;  // 直接赋值,一次赋值即可完成拷贝
vector v3;
v3 = v1;  // 直接赋值

直接赋值是最常见的一种赋值方式,实现简单明了。

3.2 迭代器赋值

vector<int> v1 = {1, 2, 3};
vector<int> v2;
v2.assign(v1.begin(), v1.end());  // 迭代器赋值
v2.assign(5, 1);  // 元素个数为5,每个元素的初值为1

迭代器赋值方式使用assign函数实现,可以实现指定范围的元素插入、赋值等操作。

3.3 移动赋值

vector<int> v1 = {1, 2, 3};
vector<int> v2 = std::move(v1);  // 移动赋值

移动赋值通过std::move函数实现,可以在不复制元素的情况下将一个vector转移到另一个vector中。

3.4 vector赋值给另一个vector

vector可以直接赋值给另一个vector,也可以使用assign函数实现。

vector<int> v1 = {1, 2, 3};
vector<int> v2;
v2.assign(v1.begin(), v1.end());  // assign函数赋值

3.5 使用swap进行赋值

vector<int> v1 = {1, 2, 3};
vector<int> v2;
v2.swap(v1);//将v1赋值给v2,此时v1变成了v2

3.6 通过数组地址初始化

int a[5]={1,2,3,4,5}
vector<int> vec_i(a,a+5);
文章来源:https://blog.csdn.net/m0_51233386/article/details/135815328
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。