首页 > 其他分享 >vector中下标[]操作、迭代器与size()在使用中遇到的问题

vector中下标[]操作、迭代器与size()在使用中遇到的问题

时间:2024-06-21 16:29:22浏览次数:26  
标签:20 迭代 int v1 vector 下标 include size

综述:

1.今天学习vector的过程中遇到的一些问题记录下来,方便日后复习以及有相同疑惑的同学参考。

2.主要关于下标与迭代器写入与读取元素。

遇到的问题:

代码如下:

#include <iostream>
#include <vector>

using namespace std;

int main(){
	unsigned int i;
	vector<int> v1;
	v1.reserve(20);
	vector<int>::iterator iter;
	cout << v1.capacity() << endl;
	cout << v1.size() << endl;
	for(i = 0; i < 15; i++){
		v1[i] = i;
	}
	cout << v1.capacity() << endl;
	cout << v1.size() << endl;
	for(iter = v1.begin(); iter != v1.end(); iter++){
		cout << *iter << '\t';
	}
	cout << endl;
	for (i = 0; i < 15; i++){
		cout << v1[i] << '\t';
	}
	cout << endl;
	return 0;
}

结果如下:

20
0
20
0

0	1	2	3	4	5	6	7	8   9	10	11	12	13	14	

分析:在容器中没有实际元素时同过下标写入的数据可以存在内存中,因为可以通过下标再读出来,但是这种做法不被标准允许,因为size()一直都是0,而且通过迭代器去读写的时候,begin==end,应该算是越界访问写入的(感觉用越界这个词也不是很准确)。

问题修正:
1.改用push_back插入数据。
#include <iostream>
#include <vector>

using namespace std;

int main(){
	unsigned int i;
	vector<int> v1;
	v1.reserve(20);
	vector<int>::iterator iter;
	cout << v1.capacity() << endl;
	cout << v1.size() << endl;
	for(i = 0; i < 15; i++){

		v1.push_back(i);
	}
	cout << v1.capacity() << endl;
	cout << v1.size() << endl;
	for(iter = v1.begin(); iter != v1.end(); iter++){
		cout << *iter << '\t';
	}
	cout << endl;
	for (i = 0; i < 15; i++){
		cout << v1[i] << '\t';
	}
	cout << endl;
	return 0;
}

运行结果:size值正确,且通过迭代器可以读出来;

20
0
20
15
0	1	2	3	4	5	6	7	8   9	10	11	12	13	14	
0	1	2	3	4	5	6	7	8   9	10	11	12	13	14	
2.创建vector容器时,指定元素个数,初始化容器方法很多,不要创建空容器再去扩容就好了。
#include <iostream>
#include <vector>

using namespace std;

int main(){
	unsigned int i;
	vector<int> v1(20);
//	v1.reserve(20);
	vector<int>::iterator iter;
	cout << v1.capacity() << endl;
	cout << v1.size() << endl;
	for(i = 0; i < 15; i++){

		v1[i] = i;
	}
	cout << v1.capacity() << endl;
	cout << v1.size() << endl;
	for(iter = v1.begin(); iter != v1.end(); iter++){
		cout << *iter << '\t';
	}
	cout << endl;
	for (i = 0; i < 15; i++){
		cout << v1[i] << '\t';
	}
	cout << endl;
	return 0;
}

运行结果:结果size为20,且最后5个数字为0,说明指定个数初始化是往vector中放如了20个0。迭代器使用也正常。

20
20
20
20
0	1	2	3	4	5	6	7	8   9	10	11	12	13	14	0	0	0   0	0	
0	1	2	3	4	5	6	7	8   9	10	11	12	13	14	
总结:

vector中[]的使用只是针对已有的实际元素去读取或者修改,通过下标去写入有容量的空容器,编译不会检查错误,且可以写入,但是容器库识别不了这种做法,所以相应的size()值与begin()、end()返回的迭代器都不会变, 所以写入或修改元素最好还是用容器库提供的接口去操作更安全。

标签:20,迭代,int,v1,vector,下标,include,size
From: https://blog.csdn.net/Il_l_Il/article/details/139857170

相关文章

  • fortran 数组下标从0还是1开始?
    Fortran语言中,数组的下标是从1开始的,这与许多其他编程语言(如C、Python或Java)将数组下标从0开始的习惯不同。这种从1开始的下标命名方式源于Fortran的历史,当时的记录卡片和编程语言是从1开始编号的。以下是一个Fortran代码示例,展示了如何声明一个数组并使用从1开始的下标:program......
  • 0基础学C++ | 第02天 | 基础知识 | sizeof关键字 | 浮点型 | 字符型 | 转义字符 | 字
    前言  该文章是在B站学习C++,同时结合自己的理解整理的笔记,视频连接:https://www.bilibili.com/video/BV1et411b73Z/?p=8&spm_id_from=333.880.my_history.page.click 1、sizeof关键字作用:利用sizeof关键字可以统计数据类型所占用的内存大小语法:sizeof(数据类型/变量)#incl......
  • 2748. 美丽下标对的数目(Rust暴力枚举)
    题目给你一个下标从0开始的整数数组nums。如果下标对i、j满足0≤i<j<nums.length,如果nums[i]的第一个数字和nums[j]的最后一个数字互质,则认为nums[i]和nums[j]是一组美丽下标对。返回nums中美丽下标对的总数目。对于两个整数x和y,如......
  • Error: Insufficient memory (Failed to allocate 16588800 bytes) in void* cv::OutO
    这个错误信息表明在运行OpenCV库时遇到了内存不足的问题。具体来说,OpenCV尝试分配大约16,588,800字节(16MB)的内存,但操作系统无法满足这个请求。这可能是由于以下原因:内存限制:你的设备或系统可能没有足够的内存来处理当前操作。这在资源有限的设备(如某些嵌入式系统或旧手机)上尤......
  • 【C++】vector的使用和模拟实现
    ❤️欢迎来到我的博客❤️前言vector示可变大小数组的序列容器就像数组一样,vector也采用的连续存储空间来存储元素既然都是数组并且都可以动态增长那么vector能不能替代string呢?答案是不能原因如下:string和vector在结构上有所不同不同点:string要求末尾有’\0’(自动......
  • 2024-06-19:用go语言,给定一个起始下标为 0 的整数数组 nums 和一个整数 k, 可以执行一个
    2024-06-19:用go语言,给定一个起始下标为0的整数数组nums和一个整数k,可以执行一个操作将相邻两个元素按位AND后替换为结果。要求在最多执行k次操作的情况下,计算数组中所有元素按位OR后的最小值。输入:nums=[3,5,3,2,7],k=2。输出:3。解释:执行以下操作:1.将nums[0]......
  • vector的特性及使用
    1、 vector的定义:单独定义一个vector的形式为:vector<typename>vector; 1.如上定义其实相当于一个大小可变化的序列容器,即变长数组。2.vector采用连续的储存空间来储存元素,意味着可以通过下标来访问元素,和数组一样高效,但是又比数组更优秀,它的大小是可以动态改变的,而且......
  • OGG Extract / Replicat Checkpoint RBA Is Larger than Local Trail Size (Doc ID 11
    环境:OS:Centos6DB:11.2.0.4ogg:12.3.0.1说明:从库突然宕机重启后导致1.报错如下 计算公式:Newdatapump/ReplicatRBA=Reader'stoo-bigcheckpointRBA(A)+FirstrecordRBAinthenewtrailfile(aftertherestartabend)(B)-RBAofthematchingrecord......
  • Vector | Graph:蚂蚁首个开源Graph RAG框架设计解读
    检索增强生成(RAG:RetrievalAugmentedGeneration)技术旨在把信息检索与大模型结合,以缓解大模型推理“幻觉”的问题。近来关于RAG的研究如火如荼,支持RAG的开源框架也层出不穷,并孕育了大量专业领域的AI工程应用。我们设计了一个通用的开源RAG框架,以兼容未来多样化的基础研究建设和工......
  • 代码随想录刷题记录(8)| 字符串(151.反转字符串里的单词,卡码网:55.右旋转字符串,28. 找出字
    目录(四)反转字符串里的单词1. 题目描述2.思路3.解题过程(1)使用额外空间存储(2)原地反转 (五)右旋转字符串1.题目描述2.思路3.解题过程 (六)找出字符串中第一个匹配项的下标1.题目描述2.思路3.解题思路(七)重复的子字符串1.题目描述2.思路3.解题过程(八)......