概述
C++中的vector在我的理解中就可以认为是一种不限长度、可自定义类型的数组,它的访问方法可以参考数组。
for循环的理解可以通过自己运行代码分析。
一、查找vector极值
#include <vector>
#include <algorithm>
#include <iostream>
int main()
{
std::vector<double> v{ 1.0, 2.0, 3.0, 4.0, 5.0, 1.0, 2.0, 3.0, 4.0, 5.0 };
std::vector<double>::iterator biggest = std::max_element(std::begin(v), std::end(v));
std::cout << "Max element is " << *biggest << " at position " << std::distance(std::begin(v), biggest) << std::endl;
auto smallest = std::min_element(std::begin(v), std::end(v));
std::cout << "min element is " << *smallest << " at position " << std::distance(std::begin(v), smallest) << std::endl;
}
二、vector的访问
可以通过下标进行,并且下标是从0开始的。
#include<iostream>
#include <vector>
using namespace std;
int main()
{
int i;
int j=10;
int a[15] = { 1, 2, 3, 4, 5 ,6,7,8,9,10,11,12,13,14,15};//新建数组,并填充数据
vector<int> dist(a,a+15);//让新建的vector取值数组a从1到15
cout << "dist[14]="<<dist[14] << endl;//查看vector下的dist的最后一位是不是数组的最后一位,确保正确
for (i = 0; i<j; ++i)//从0开始访问,下标为0—9,共输出10个元素。
{
cout << dist[i] << endl;
}
cout << "一、最后i的结果是:" << i << endl;//最后++i导致i=10的时候,通过i<j?的比较发现不符合要求,就会跳出循环,但是i已经等于10了
system("pause");
return 0;
}
多维vector的访问:https://blog.csdn.net/u010159842/article/details/51325185
vector<vector<int>> S(nr_points, vector<int>(20)); //创建一个nr_points行20列的int型二维数组,存放每个增长区域的索引;
int S1 = 0;//用于访问S时的行的值
int S2 = 0;//用于访问S是的列的值
S[S1][S2] = i;
三、原样输出vector到txt
方法一:输出vector为竖排的txt,保持矩阵原样,是竖着的一列
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
int main()
{
vector<string> vec;//新建vector的对象vec
vec.push_back("马年快乐!!!");
vec.push_back("so easy!!!!");
ofstream out("out.txt",ios::out);
int len = vec.size();//获取vector的对象vec的长度
for(int i=0;i<len;++i)
{
out<<vec[i]<<endl;
}
}
内容写进了out.txt文件中。
因为vector重载了[ ]运算符,所以我直接把它当作数组用了,当然可以用vector的迭代器iterator访问。
主要就是产生一个ofstream的对象,然后用<<把内容输入到这个文件就行了,<<的用法与输入到屏幕时是一样的。
方法二:输出vector结果为横排的txt:“hello word!”,而非竖着的一列。
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
int main(int argc, char** argv)
{
string a = "hello ";
string b = "world ";
string c = "!n";
vector<string> vec;//新建vector的对象vec
vec.push_back(a);//填充vec
vec.push_back(b);//填充vec
vec.push_back(c);//填充vec
ofstream fout;
fout.open("a.txt", ios_base::out);
if (fout.is_open())
{
for (vector<string>::iterator i = vec.begin(), end = vec.end(); i != end; ++i)
{
fout << (*i);
}
}
fout.close();
return 0;
}
四、常见用法(以int类型为例)
[https://www.cnblogs.com/YJthua-china/p/6550960.html]
1.声明及初始化
vector<int> a; //声明一个int型向量a
vector<int> a(10); //声明一个初始大小为10的向量
vector<int> a(10, 1); //声明一个初始大小为10且初始值都为1的向量
vector<int> b(a); //声明并用向量a初始化向量b
vector<int> b(a.begin(), a.begin()+3); //将a向量中从第0个到第2个(共3个)作为向量b的初始值
int n[] = {1, 2, 3, 4, 5};
vector<int> a(n, n+5); //将数组n的前5个元素作为向量a的初值
vector<int> a(&n[1], &n[4]); //将n[1] - n[4]范围内的元素作为向量a的初值
(1)不带参数的构造函数初始化
//初始化一个size为0的vector
vector<int> abc;
- 不带长度的vector必须要用push_back();赋值:L.push_back(i+1);
(2)带参数的构造函数初始化
//初始化size,但每个元素值为默认值
vector<int> abc(10); //初始化了10个默认值为0的元素
//初始化size,并且设置初始值
vector<int> cde(10,1); //初始化了10个值为1的元素
(3)通过数组地址初始化
int a[5] = {1,2,3,4,5};
//通过数组a的地址初始化,注意地址是从0到5(左闭右开区间)
vector<int> b(a, a+5);
(4)通过同类型的vector初始化
vector<int> a(5,1);
//通过a初始化
vector<int> b(a);
(5)通过insert初始化
//insert初始化方式将同类型的迭代器对应的始末区间(左闭右开区间)内的值插入到vector中
vector<int> a(6,6);
vecot<int> b;
//将a[0]~a[2]插入到b中,b.size()由0变为3
b.insert(b.begin(), a.begin(), a.begin() + 3);
insert也可通过数组地址区间实现插入
int a[6] = {6,6,6,6,6,6};
vector<int> b;
//将a的所有元素插入到b中
b.insert(b.begin(), a, a+7);
此外,insert还可以插入m个值为n的元素
//在b开始位置处插入6个6
b.insert(b.begin(), 6, 6);
(6)通过copy函数赋值
vector<int> a(5,1);
int a1[5] = {2,2,2,2,2};
vector<int> b(10);
/*将a中元素全部拷贝到b开始的位置中,注意拷贝的区间为a.begin() ~ a.end()的左闭右开的区间*/
copy(a.begin(), a.end(), b.begin());
//拷贝区间也可以是数组地址构成的区间
copy(a1, a1+5, b.begin() + 5);
2.添加元素
vector<int> a;
a.push_back(1); //在尾部加入一个数据
a.push_back(2);
a.pop_back(); //删除最后一个数据
a.insert(a.begin(), 0); //在a.begin()之前加入0
a.erase(a.begin()); //将a.begin()的元素删除
a.erase(a.begin() + 1, a.end()); //将第二个元素以后的元素均删除
3.判断vector是否为空
vector<int> a;
if(a.empty()){
a.push_back(1);
}
4.遍历访问vector
vector<int> a;
//像数组一样以下标访问
for(int i = 0; i < a.size(); i++){
cout << a[i];
}
//以迭代器访问
vector<int>::iterator it;
for(it=a.begin(); it!=a.end(); it++){
cout<<*it<<" " ;
}
5.排序必须包含algorithm头文件
#include <algorithm>
vector<int> a;
sort(a.begin(), a.end());
6.以vector实现二维数组
vector<vector<int>> a(10, vector<int>(5)); //创建一个10行5列的int型二维数组 相当于a[10][5];
同理可以创建三维及以上数组,这些多维数组的操作同一维的vector类似。
7、删除指定位置的
方法一:
std::vector<int>::iterator it = L.begin()+10;
L.erase(it);//删除
方法二:
v1.erase( v1.begin( ) );//删除v1中的第一个元素
vec.erase(vec.begin()+2);删除第3个元素
更多插入与删除参考:https://blog.csdn.net/duan19920101/article/details/50717748
五、for循环中的++i与i++
经过验证,for循环中,最后使用++i与i++并没有什么区别
#include<iostream>
using namespace std;
int main()
{
int i;
int j;
for (i = 0; i<5; ++i)
{
cout << i << endl;
}
cout << "一、最后i的结果是:" << i << endl;
//--------------------------------------------------------------------------------------------
for (j = 0; j<5; ++j)
{
cout << j << endl;
}
cout << "二、最后j的结果是:" << j << endl;
system("pause");
return 0;
}
最后
以上就是发嗲山水为你收集整理的C++小知识(三)——Vector容器、for循环中的++i与i++一、查找vector极值二、vector的访问 三、原样输出vector到txt的全部内容,希望文章能够帮你解决C++小知识(三)——Vector容器、for循环中的++i与i++一、查找vector极值二、vector的访问 三、原样输出vector到txt所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复