c++ vector容器的常用方法整理
整理一下vector常用的一些方法
参考链接
vector主要是拿来当作动态数组使用的,使用时需要包含头文件 <vector> 。
初始化一个vector对象。
一些常用的初始化方法。
//practice string class
#include <iostream>
#include <string>
#include <vector>
int main()
{
//只是定义一个vector变量,内容为空。
std::vector<int> vi;
std::cout << vi.size() << std::endl; //size()返回元素个数为0
//使用初始化列表初始化vi2
std::vector<int> vi2 = {1,3,5,7,9};
//使用5个10初始化vi3的内容
std::vector<int> vi3(5,10);
for(auto i : vi3) std::cout << i << std::endl;
std::vector<int> vi4(vi2);
for(auto i : vi4) std::cout << i << std::endl;
std::vector<int> vi5(vi3); //使用vi3初始化vi5
for(auto i : vi5) std::cout << i << std::endl;
std::vector<int> vi6(vi3.begin(), vi3.begin()+2); //使用其他容器的迭代器初始化,从第0个到第2个
for(auto i : vi6) std::cout << i << std::endl;
return 0;
}
访问容器内的元素,常用的at(idx)函数和[idx].
//practice string class
#include <iostream>
#include <string>
#include <vector>
int main()
{
std::vector<int> vi = {1, 2, 3, 4, 5};
std::cout << vi.size() << std::endl;
//使用[]访问容器的元素没有下标范围检查,vi[5]的值是0
std::cout << vi[0] << vi[1] << vi[2] << vi[3] << vi[4] << vi[5] << std::endl;
std::cout << vi.at(0) << vi.at(1) << vi.at(2) << vi.at(3) << vi.at(4) << std::endl;
//std::cout << vi.at(5) << std::endl; //使用at访问,如果下标大于size(),则会抛出越界异常,产生崩溃
for(auto i : vi) std::cout << i; //通过for循环输出vi的值
std::cout << std::endl;
for(auto i = 0; i < vi.size(); i++)
{
vi[i] += 5; //通过下标修改vi的值
}
for(auto i : vi) std::cout << i;
std::cout << std::endl;
return 0;
}
修改容器内的元素,向vector内添加/删除元素
push_back()函数:向容器尾部添加元素
pop_back()函数:移除容器尾部的元素
//practice string class
#include <iostream>
#include <string>
#include <vector>
int main()
{
//只是定义一个vector变量,内容为空。
std::vector<int> vi;
vi.push_back(10);
vi.push_back(20);
vi.push_back(30);
std::cout << vi.size() << std::endl;
for(auto i : vi)
std::cout << i << std::endl;
vi.pop_back();
std::cout << "--------------------" << std::endl;
std::cout << vi.size() << std::endl;
for(auto i : vi)
std::cout << i << std::endl;
return 0;
}
输出结果:
3
10
20
30
--------------------
2
10
20
使用insert()在某个固定位置插入元素
//practice string class
#include <iostream>
#include <string>
#include <vector>
int main()
{
std::vector<int> vi = {1, 2, 3, 4, 5};
vi.insert(vi.begin(), 20); //在开始位置前插入元素20
for(auto i : vi) std::cout << i << ",";
std::cout << std::endl;
vi.insert(vi.begin()+3, 30); //在原来的第3个元素前面插入30.
//20 1 2 3 4 5
// ^
// 30
for(auto i : vi) std::cout << i << ",";
std::cout << std::endl;
vi.insert(vi.begin()+5, 4, 40); //在原来的第5个元素前面插入4个40.
for(auto i : vi) std::cout << i << ",";
std::cout << std::endl;
vi.clear();
vi = {1, 2, 3, 4, 9, 10};
std::vector<int> vi2 = {5, 6, 7, 8, 9};
vi.insert(vi.begin()+4, vi2.begin(), vi2.begin()+4); //将vi2的第0个到第4个元素插入到vi的第4个位置前面
for(auto i : vi) std::cout << i << ",";
std::cout << std::endl;
return 0;
}
运行结果:
20,1,2,3,4,5,
20,1,2,30,3,4,5,
20,1,2,30,3,40,40,40,40,4,5,
1,2,3,4,5,6,7,8,9,10,
清空容器内的内容:clear()
//practice string class
#include <iostream>
#include <string>
#include <vector>
int main()
{
std::vector<int> vi = {1, 2, 3, 4, 5};
std::cout << vi.size() << std::endl;
//清空容器的内容
vi.clear();
std::cout << "After clear: " << vi.size() << std::endl;
return 0;
}
运行结果:
5
After clear: 0
删除指定位置的元素, 参数可以传入要删除位置的迭代器,例如erase(vi.begin())或要删除的范围erase(vi.begin(), vi.begin()+2).
//practice string class
#include <iostream>
#include <string>
#include <vector>
int main()
{
std::vector<int> vi = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
std::cout << vi.size() << std::endl;
for(auto i : vi) std::cout << i << " ";
std::cout << std::endl;
vi.erase(vi.begin()+5);
//前回erase后,vi.begin()+5的元素和最初的vi的元素不同,迭代器失效
vi.erase(vi.begin()+5);
std::cout << vi.size() << std::endl;
for(auto i : vi) std::cout << i << " ";
std::cout << std::endl;
vi.erase(vi.begin()+2, vi.begin()+5); //左闭右开,位于begin()+2的元素会被移除,但是begine()+5的不会被移除
std::cout << vi.size() << std::endl;
for(auto i : vi) std::cout << i << " ";
std::cout << std::endl;
return 0;
}
迭代器
vector提供了begin(),cbegin(),end(),cend(),rbegine(),rend(),crbegin(),crend()几种迭代器。
end()指向的是最后一个元素的下一个位置,而不是最后一个元素。
例如,vector<int> vec = {1, 2, 3, 4, 5};,则end()指向5后面的位置。rend()指向1前面的位置。
//practice string class
#include <iostream>
#include <vector>
int main()
{
std::vector<int> vi = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
for(std::vector<int>::iterator it = vi.begin(); it != vi.end(); it++)
{
*it += 10; //通过iterator修改容器内元素
}
for(auto i : vi) std::cout << i << " ";
std::cout << std::endl;
for(std::vector<int>::const_iterator cit = vi.begin(); cit != vi.end(); cit++)
{
//*cit += 10; //编译error,不能够通过const_iterator修改容器的值
std::cout << *cit << " ";
}
std::cout << std::endl;
return 0;
}
容器的其他信息
可以通过empty()来判断当前容器是否为空,或者判断begin()和end()是否相等。
//practice string class
#include <iostream>
#include <vector>
int main()
{
std::vector<int> vi;
std::cout << "empty:" << vi.empty() << " size = " << vi.size() << " begine == end ?" << (vi.begin() == vi.end()? "Yes" : "No") << std::endl;
vi.push_back(100);
std::cout << "empty:" << vi.empty() << " size = " << vi.size() << " begine == end ?" << (vi.begin() == vi.end()? "Yes" : "No") << std::endl;
return 0;
}
empty:1 size = 0 begine == end ?Yes
empty:0 size = 1 begine == end ?No

浙公网安备 33010602011771号