STL:vectoer

2023-10-26

#首先包含头文件:

#include <vector>

using namespace std;//需要使用该命名空间

 

#然后定义对象:

vector<int> m_steps;

 

#向对象中添加数据:

m_steps.push_back(123);

vector.push_back的对象所属类一定是要实现了拷贝构造函数以及”=”运算符重载的

当将某些自定义类的对象push_back出错时,可以考虑vector中保存该类的指针

 

#然后可以像数组一样使用该对象的数据:

int a =m_steps[0];

 

#获取第一个元素,返回一个迭代器:(序列允许为空。若序列为空,则指向序列末端的下一个位置)

m_steps.begin();

 

#获取最后一个元素,返回的是引用,也就是最后一个元素的实际值:(序列不允许为空)

m_steps.back();

 

#获取最后一个元素的下一个位置,返回一个迭代器:(序列是否为空无影响)

m_steps.end();

 

#判断序列是否为空:

m_steps.empty();//若为空返回true,否则返回false

 

#vector中元素逆置:

#include<algorithm>

reverse ( m_steps.begin(),m_steps.end());

 

#去除vector中的重复元素:

#include<algorithm>

sort(m_steps.begin(),m_steps.end());//首先要调用默认排序

m_steps.erase(unique(m_steps.begin(),m_steps.end() ), m_steps.end());

 

#vector数组求和:

首先包含头文件:

#include < numeric>

int sum = std::accumulate(v.begin(), v.end(), 0); //求和

其函数原型为:

template< class InputIt, class >
T accumulate
( InputIt first, InputIt last, Tinit );

①  first:求和序列的第一个元素位置

②  last:求和序列的最后一个元素位置

③  init:和的初始值。对序列求和后,加上该值,即为所得结果

该求和函数可对任何重载了+=的数据类型调用,包括结构体和类,而不仅局限于基本数据类型。

该函数的内部实现为:使用一个for循环,让迭代器从第一个元素一直遍历到最后一个元素并叠加。效率并不比自己实现一个累加函数更高。

 

#定义static类型vector

static std::vector<std::vector<GLPoint>>      m_vPoints;

上面定义了一个二维的static类型vector。一维同理。

若要在类中定义static类型vector成员变量:

.h文件

static std::vector<std::vector<GLPoint>>      m_vPoints;

.cpp文件

std::vector<std::vector<GLPoint>>        className::m_vPoints;

这样会调用vector的默认构造函数以进行初始化。

 

#设置vector大小:

m_steps.resize(5);//vector设为5个元素大小

该函数只用于设置vector大小,设置的同时不会对已有元素进行清除。若vector中有10个元素,m_steps.resize(5)会只保留前5个元素;若vector中有3个元素,m_steps.resize(5)会将vector大小调整为5,其中前3个元素保留原值。

 

#vector定义二维数组:定义一个1011列的数组:

①  vector <vector<int>  >   array;//使用vector嵌套定义。注意两个”>”之间要有空格,否则会被认为是”>>”运算符

array.resize(10); //设置第一维大小

for(int  i=0;i<10;i++)
     array[i].resize(11); //设置第二维大小

②  vector定义二维数组还有另一种写法:

vector <int>  array[10];

用法跟上面相同,但是不需要对第二维进行resize不推荐使用该写法,该写法属于CC++混用的写法。

 

 

#vector作参数:

void Function(vector < int> &vecTest); //函数声明

vector< int > vec;  //定义vector

Function (vec);  //vector作参数来调用

 

#vector作返回值:

std::vector<double>GetStandLength();//函数声明

然后在函数内部定义一个std::vector<double>,最后返回该vector即可。

 

#vector指针

只要将vector <int >看作是类型即可。以下代码测试通过:

vector< int > vA; //定义vector

vector< int >* pvA; //定义vector指针

for (int i =0;i<7;i++)

{

         vA.push_back(i); //初始化vector

}

pvA = &vA; //vector指针赋值

for (int i=0;i<7;i++)

{

         cout<<(*pvA)[i]<<endl; //使用vector指针

}

cout<<( int)pvA->size();

注意vector指针指针vector是不同的。

vector指针:vector< int>* pvA;//指向vector的指针

指针vector:vector< int*> vpA;//存储指针的vector

 

#删除末尾的数据:

m_steps.pop_back();

 

#删除指定位置的数据:

m_steps.begin()为第一个元素,即相当于索引为0,也就是第0个元素。

若要删除索引为k的元素,也就是第k+1个元素,如下:(删除后后面所有的元素前移,返回值为下一个元素)

m_steps.erase(m_steps.begin()+k);

m_steps.erase(m_steps.begin());//删除第一个元素

 

#删除指定区间的数据:

如下,删除了索引为[m,n)区间的所有数据。注意m为闭区间n为开区间。也就是从第m+1个元素(包括自身)开始删除,一直删除到第n个元素。(n+1个元素不删除)

m_steps.erase(m_steps.begin()+m, m_steps.begin()+n);

注意:当m=n时,是不会做任何删除的。如:

m_steps.erase(m_steps.begin()+k, m_steps.begin()+k);//该操作不会做任何删除

 

#合并两个vector的数据,将一个vector中的数据添加到另一个同类型vector之后:即A=A+B=AB;

m_vectorA.insert(m_vectorA.end(),m_vectorB.begin(),m_vectorB.end());

注意insert的作用是将数据插入指定元素之前。

 

#vector的指定索引插入数据:

0号元素后面插入5个元素,其值都是10

也就是在1号元素前面插入5个元素,其值都是10

m_vectorA.insert(m_vectorA.begin()+1,5,10);

A后面插入5个元素,其值都是10

m_vectorA.insert(m_vectorA.end(),5,10);

 

#复制vector中的数据(一维,二维,多维)

可以直接使用 = 来复制vector中的数据,无论是几维的vector

//一维的情形

vector <int> array1;

为array1赋值;

vector <int> array2;

array2 = array1;//这样即可以将array1中的所有数据复制过来

 

//二维的情形

vector <vector<int>  >   array;

array.resize(5); //设置第一维大小

for(int i=0;i<5;i++)

                   array[i].resize(7);//设置第二维大小

//为二维数组挨个赋值

for (int i = 0;i<5;i++)

{

         for (int j=0;j<7;j++)

         {

                   array[i][j] = 0;

         }

}

 

vector <vector <int>  >   array2;

array2 = array;//这样就可以将array中所有的数据复制过来,不用对array2进行resize指派大小。之后array2的数据就是不依赖于array独立存在的。

 

 

#删除指定数据:

1.删除指定位置数据:

比如删除第4个元素:

m_steps.erase(m_steps.begin()+3);

注意erase()函数的参数是一个iterator,它没有一个参数为int的版本,所以不可以使用m_steps.erase(3)这样的格式,而必须指定一个iterator给它,就像上面的v.begin()+3就是指第4个元素。

2.删除指定值数据:

由于erase()函数的参数必须用iterator,故删除的时候需要得到指定数据所在的iterator

vector<int>::iterator begin = key.begin();//获取开始位置的iterator,注意vector后的数据类型要统一

for(size_t i = 0;i <key.size();)

{

         if (key[i] == 7)//若当前值等于指定值,则需要将当前数据删除

         {

                   key.erase(begin+i); //删除当前元素

         }

         else

         {

                   i++;

         }

}

注意for循环判断结束条件的写法以及i++的位置。因为删除数据后,vector的大小发生了变化,故而判断条件不能写成一个固定的大小。当删除一个数据后,后面的数据前移,此时i就不应该继续自增。

 

#获取vector中元素的个数(多少个,比下标多1)

size_t num = m_steps.size();

size_t的定义是:typedef unsigned int size_t

也就是说size_t类型相当于一个UINT,但是无论是将size_t赋值给int还是UINT,都会提示数据丢失

比较好的做法是直接使用size_t数据类型。size_t数据类型依然可以用来作为数组的下标。如:

size_t stepNum = m_steps.size();

                   for (size_t i = 0;i< stepNum;i++)

                   {

                            m_steps[i].YuDrawPicture(&dc);

                   }

 

#对二维数组进行旋转:

1.顺时针旋转90°

即:

1 2 3    7 4 1

4 5 6 –> 8 5 2

7 8 9    9 6 3

思路:首先复制一个二维数组2,从2中取一个元素,然后直接把该元素在数组1中旋转后的位置赋值即可。

设有名为array1的vector二维数组,该数组大小为n*n,该数组已经有数据。并定义名为array2的二维数组。

array2 = array1;//array1的数据复制到array2中保存

for (int i = 0;i<n;i++)

{

         for (int j=0;j<n;j++)

         {

             array1[j][n-i-1] =array2[i][j];

         }

}

这样array1中的数据就已经做了顺时针旋转90°的操作。

2.逆时针旋转90°

即:

1 2 3    3 6 9

4 5 6 –>   2 5 8

7 8 9    1 4 7

思路:首先复制一个二维数组2,从2中取一个元素,然后直接把该元素在数组1中旋转后的位置赋值即可。

设有名为array1的vector二维数组,该数组大小为n*n,该数组已经有数据。并定义名为array2的二维数组。

array2 = array1;//array1的数据复制到array2中保存

for (int i = 0;i<n;i++)

{

         for (int j=0;j<n;j++)

         {

             array1[n-j-1][i] =array2[i][j];

         }

}

这样array1中的数据就已经做了逆时针旋转90°的操作。

 

#交换两个vector

无论两个vector中的数据个数是否相同

vector1.swap(vector2);

 

#交换两个指定数据:

swap(m_steps[0], m_steps [7]);

 

#vector中的数据进行排序:

首先要声明一个排序规则函数,必须使用静态:

static bool cmp(const int& sp1,const int& sp2);

然后实现,注意书写格式:

bool CXXX::cmp(const int&sp1,const int& sp2)

{//升序排序:前者的值小于后者

         if (sp1<sp2)

         {

                   return true;

         }

         else

         {

                   return false;

         }

}

然后调用排序函数,函数的最后一个参数传进排序规则函数名:

sort(m_steps.begin(),m_steps.end(),CXXX::cmp);

注意sort()函数需要使用头文件#include <algorithm>

if的比较条件中,只能使用简单的比较运算,不可以使用<=或者>=

 

#最后在析构函数中清空vector对象:(即使使用了多维的vector,也只需要调用一个clear清空最外层的数组即可,其他内层的数组无论有多少层,会全部都被清除)

ConvexShell::~ConvexShell(void)

{

         m_steps.clear();

}

clear()删除储存在vector中的所有元素. 如果vector的元素是一些object,则它将为当前储存的每个元素调用它们各自的析构函数。然而, 如果vector储存的是指向对象的指针, 此函数并不会调用到对应的析构函数。在第二种情况下, 为了完全删除vector中的元素则应使用一个类似于下的循环:

for(int i=0 ;i<aVector.size() ; i++)

{

        deleteaVector[i];

}

         aVector.clear();

 

 

vector中的数据是连续存储的。若vector中的存储空间不足以存储接下来要存入的元素,那么vector会申请一片足够大的内存,将自身已存储的元素复制过去,然后再接收将要存入的元素。所以新元素存入后,vector中的数据依然是连续的。

获取vector中数据区首地址的方法是:&aVector[0];

如:

int*pInt   =       &vNum[0];

或:

int*pInt   =       new int[100];

memcpy(pInt,&vNum[0],sizeof(int)*100);

都是正确的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STL:vectoer 的相关文章

  • 如何从 boost::shared_ptr 释放指针?

    boost shared ptr 可以释放存储的指针而不删除它吗 我可以看到文档中不存在释放函数 并且在常见问题解答中也解释了为什么它不提供释放函数 例如不能在不唯一的指针上完成释放 我的指点是独一无二的 我怎样才能释放我的指针 或者使用哪
  • DDD 领域模型复杂验证

    我正在努力使用域驱动设计原则重写我的 ASP NET MVC 应用程序 我正在尝试验证我的用户实体 到目前为止 我能够验证基本规则 例如用户名和密码是非空 空白字符串 然而规则之一是 我需要确保用户名是唯一的 但是 我需要访问数据库才能执行
  • 在 Chrome 和 IE11 上流式传输可观看的 .mjpeg 视频

    我在本地托管了一个 mjpeg 文件http 127 0 0 1 web Images Stream somevideo mjpeg http 127 0 0 1 web Images Stream somevideo mjpeg 我在我的
  • 实体框架 6 和集合

    我正在开发我的第一个实体框架应用程序 我正在使用 EF 版本 6 来自 Nuget 和 net 4 0 然而 我在一些对我来说似乎应该非常简单的事情上遇到了一些困难 我在互联网上发现了很多相互矛盾的建议和解决方案 但是在花了几天时间尝试解决
  • 调试断言失败 OpenCv is_block_type_valid(header->_block_use)

    我是使用 Visual Studio 和 openCv 编程的新手 我编写了一个简单的程序来显示图像的红色通道 但每次运行代码时都会抛出 DEBUG ASSERTION FAILED 错误 include
  • 无法将简单的无符号字节 RGB 纹理映射到四边形:

    我有一个非常简单的程序 将虚拟红色纹理映射到四边形 下面是 C 中的纹理定义 struct DummyRGB8Texture2d uint8 t data 3 4 int width int height DummyRGB8Texture2
  • WPF MediaElement 应用程序的播放列表

    我正在通过构建 WMP 类型的应用程序来学习 C 和 WPF 下面的代码运行良好 从列表框中选择一部电影在媒体元素中运行它 我遇到的问题是找到一种方法在电影结束后自动开始下一部电影 谢谢 提供电影列表的 xml 文件 熊 c 电影 Bear
  • 按索引列出的 QML 模型数据

    我有基于 QAbstractListModel 的模型 class RecordModel public QAbstractListModel QQmlContext ctxt engine rootContext ctxt gt setC
  • 从 C# 中的服务器下载后,Zip 文件被损坏

    request MakeConnection uri WebRequestMethods Ftp DownloadFile username password response FtpWebResponse request GetRespo
  • gdb:“未加载符号表”

    尝试在 gdb 中添加断点时 我不断收到此错误消息 我使用这些命令来编译 gcc g main c utmpib2 c o main o and cc g main c utmpib2 c o main o and also g g mai
  • C# 中的内部设置属性是什么?

    我刚刚遇到了一个未知的 C 概念 谁能告诉我内部设置属性的目的是什么 它有什么用 我知道内部关键字用于在程序集中工作 如果您有一个带有内部 set 访问器 和公共 get 访问器 的属性 则意味着程序集中的代码可以读取 获取 和写入 设置
  • 给定一个字符串数组,返回所有属于字谜词组的字符串

    给定一个字符串数组 返回所有属于字谜词的字符串组 我的解决方案 对于数组中的每个字符串单词 对其进行排序 O m lg m m 是单词的平均长度 建立一个哈希表 将排序后的单词作为键放入哈希表中 并生成该单词的所有排列 O m 如果字典中存
  • 如何用SDL2和OpenGL画三角形?

    我正在使用 C 中的 SDL2 和 OpenGL 开发一个简单的应用程序 问题是我的程序没有绘制三角形 Rect hpp 绘制三角形的类 ifndef Rect hpp define Rect hpp include
  • 为什么 gcc 和 NVCC (g++) 会看到两种不同的结构大小?

    我正在尝试将 CUDA 添加到 90 年代末编写的现有单线程 C 程序中 为此 我需要混合两种语言 C 和 C nvcc 是 c 编译器 问题在于 C 编译器将结构视为特定大小 而 C 编译器将相同的结构视为略有不同的大小 那很糟 我对此感
  • 多线程代理检查器

    我有很少的代码 例如 using WebClient wc new WebClient wc Proxy new WebProxy IP Port resume if wc IsBusy string rtn msg string Empt
  • 通过实施 Web 服务向 Alexa 托管自定义技能

    我正在开发一个网络服务 用于处理 Alexa 发送的请求并在 net 框架中以特定响应进行响应 Alexa 以 JSON 格式发送到您的服务的请求正文 如下所示 version string session new true session
  • 在不改变目标类型的情况下以最高精度序列化浮点数

    我需要反序列化原始二进制数据 BinaryFormatter 然后序列化为 JSON 用于编辑 然后再次将其序列化回二进制 显然 我输在了浮动上 原始浮点值0xF9FF4FC1 大端 大致 12 9999933 四舍五入为0xF6FF4FC
  • 是否可以在 C++11 之前创建函数局部闭包?

    借助 C 11 我们获得了 lambda 并且可以在我们真正需要的地方 而不是在它们不真正属于的地方 即时创建函数 函子 闭包 在 C 98 03 中 创建函数局部函子 闭包的好方法如下 struct void operator int i
  • 无法将必备组件放在与我的应用程序相同的位置

    我使用 VS 2013 我希望 sql server 2012 express localdb 与我创建安装程序时的应用程序位于同一位置 因此 在项目属性 gt 发布 gt 先决条件中 我选择第二个选项 从与我的应用程序相同的位置下载先决条
  • OpenCV 2.4.2 中的错误“OpenCV 错误:错误标志”

    我刚刚开始尝试使用 OpenCV 并根据一本书编写了一个非常简单的小程序 问题是当我尝试编译它时 出现此错误 我会给你我所掌握的所有信息 我使用 Mac OS X 10 7 的 homebrew 安装了 openCV include

随机推荐