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;
}
int main()
{
vector<int> v;
v[0] = 1;
cout << v[0] << " " << endl;
return 0;
}
报错 “vector subscript out of range
”,下标超出范围;
问题在于“v[0] = 1”一句,
一开始vector为空时,因为还没有分配内存空间
。使用下标赋值 运行会出现内存非法操作的错误。
vector 真的 不能使用标赋值吗?并不是
分析下表出错原因:
vector<int> v;
此时vector为空, size为0,一开始vector为空时,因为还没有分配内存空间
。使用下标赋值 运行会出现内存非法操作的错误。
1 默认初始化,无参(没给定数组大小)
vector<int> res;//默认初始化
vector为空, size为0,表明容器中没有元素,而且 capacity 也返回 0,意味着还没有分配内存空间。
这种初始化方式适用于元素个数未知,需要在程序中动态添加的情况;
添加元素,只能用.push_back();
for (int i = 10; i < 18; i++)
res.push_back(i);
下面 下标赋值错误,因为还没有分配内存空间。
2 带参数构造初始化 (给定数组大小、初始值)
vector<int> res(8);
res中将包含8个元素,每个元素进行缺省的值初始化,对于int,也就是被赋值为0,因此res被初始化为包含8个0。
等同于
vector<int> res(8,0);
指定值初始化,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;
//先通过 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;
}
失败,
和直接下标赋值效果一样的
//定义数组
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;
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
vector v1 = {1, 2, 3};
vector v2 = v1; // 直接赋值,一次赋值即可完成拷贝
vector v3;
v3 = v1; // 直接赋值
直接赋值是最常见的一种赋值方式,实现简单明了。
vector<int> v1 = {1, 2, 3};
vector<int> v2;
v2.assign(v1.begin(), v1.end()); // 迭代器赋值
v2.assign(5, 1); // 元素个数为5,每个元素的初值为1
迭代器赋值方式使用assign函数实现,可以实现指定范围的元素插入、赋值等操作。
vector<int> v1 = {1, 2, 3};
vector<int> v2 = std::move(v1); // 移动赋值
移动赋值通过std::move函数实现,可以在不复制元素的情况下将一个vector转移到另一个vector中。
vector可以直接赋值给另一个vector,也可以使用assign函数实现。
vector<int> v1 = {1, 2, 3};
vector<int> v2;
v2.assign(v1.begin(), v1.end()); // assign函数赋值
vector<int> v1 = {1, 2, 3};
vector<int> v2;
v2.swap(v1);//将v1赋值给v2,此时v1变成了v2
int a[5]={1,2,3,4,5}
vector<int> vec_i(a,a+5);