vector的坑——C++primer练习6.33总结
说来惭愧,一道简单的对vector递归的题目写了一个多小时,最后还是请教了大神才改出来。
首先贴上原代码:
void return_vector(vector<int>::iterator,vector<int>);
int main()
{
int n, temp;
vector<int> symbol{};
cin >> n;
for (int i = ; i < n; ++i)
{
cin >> temp;
symbol.push_back(temp);
}
return_vector(symbol.end(), symbol);
system("pause");
return ;
}
void return_vector(vector<int>::iterator ptr,vector<int> a)
{
if (ptr != a.begin()) return_vector(ptr - , a);
cout << *ptr << endl;
}
结果提示错误:vector iterators incompatible!
然后调试了一下,用非递归形式模拟这个过程:
for (auto i = symbol.end();i != symbol.begin(); i = i - )
cout << *i << endl;
依然提示该错误,调试发现是对end()函数理解有误,C++Primer中写到:end()返回vector最后一个元素的下一个位置。
改之:
for (auto i = symbol.end()-;i != symbol.begin(); i = i - )
cout << *i << endl;
测试通过!
改正之前代码,运行,依然报同一个错误。
继续调试,发现是在
if (ptr != a.begin()) return_vector(ptr - , a);
这一句中的!=出现错误(F11跟到了!=的重载的位置),但不知道具体哪儿出错。
大神帮我看了下变量的地址,发现a.begin()和ptr的指向的地址不相同,遂想到是否因为是传入的是形参,导致函数中的vector<int> a 和main中定义的 vector<int> symbol并不是同一个vector,而a是symbol的一个拷贝?
于是将函数改成传入symbol的引用:
void return_vector(vector<int>::iterator,vector<int>&);
int main()
{
int n, temp;
vector<int> symbol{};
cin >> n;
for (int i = ; i < n; ++i)
{
cin >> temp;
symbol.push_back(temp);
}
return_vector(symbol.end() - , symbol);
//for (auto i = symbol.end()-1;i != symbol.begin(); i = i - 1)
// cout << *i << endl;
system("pause");
return ;
}
void return_vector(vector<int>::iterator ptr,vector<int>& a)
{
if (ptr != a.begin()) return_vector(ptr - , a);
cout << *ptr << endl;
}
测试,通过!
总结:
1.在对传入的vector或者数组等参数没有改变的时候,最好使用引用,这样一些指针依然存在意义,而且不容易出错。
2.end()函数指向的是容器的最后一个元素的下一个位置,切不可直接对XXX.end()直接解引用。
3.由是想到函数参数的一些问题:何时传入引用,何时传入指针?二者的优劣(如果有的话)?什么时候应该使用const,什么时候不行?这些都还需要细细理解。
vector的坑——C++primer练习6.33总结的更多相关文章
- c++ vector 的坑
一个空的vector执行pop_back操作会发生什么 由于之前看STL源码剖析的时候,发现所执行的操作如下: 只是简单的将末尾的finish迭代器减1后destroy.这让人产生一个疑问:假如这个v ...
- [转载]Vector用法(C++ Primer中文版)
转自:http://blog.sciencenet.cn/blog-261330-551086.html vector 是同一种类型的对象的集合,每个对象都有一个对应的整数索引值.和 string 对 ...
- C++primer 练习11.33:实现你自己版本的单词转换程序
// 11_33.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...
- C++ Primer 5th 第3章 字符串、向量和数组
*****代码在Debian g++ 5.40 / clang++ 3.8(C++11)下编写调试***** 本章主要是关于字符串.数组的内容,以及一些简单的容器知识. 1.using的声明 usin ...
- Java 集合系列之 Vector详细介绍(源码解析)和使用示例
Vector简介 Vector 是矢量队列,它是JDK1.0版本添加的类.继承于AbstractList,实现了List, RandomAccess, Cloneable这些接口. Vector 继承 ...
- Vector源码解析
概要 学完ArrayList和LinkedList之后,我们接着学习Vector.学习方式还是和之前一样,先对Vector有个整体认识,然后再学习它的源码:最后再通过实例来学会使用它.第1部分 Vec ...
- Java集合--Vector
转载请注明出处:http://www.cnblogs.com/skywang12345/p/3308833.html 第1部分 Vector介绍 Vector简介 Vector 是矢量队列,它是JDK ...
- Fundamentals of Computer Graphics 中文版(第二版) (Peter Shirley 著)
1 引言 2 数学知识 3 光栅算法 4 信号处理 5 线性代数 6 矩阵变换 7 观察 8 隐藏面消除 9 表面明暗处理 10 光线追踪 11 纹理映射 12 完整的图形流水线 13 图形学的数据结 ...
- 【LeetCode】2020-04 每日一题
8. 字符串转换整数 (atoi)(中等) [分类]:模拟.正则表达式 [题解]: 解法1:直接模拟,但是在判断INT_MAX和INT_MIN上需要注意,因为直接判断会超出范围,所以可以将式子转换一下 ...
随机推荐
- Linux内核调试技术——jprobe使用与实现
前一篇博文介绍了kprobes的原理与kprobe的使用与实现方式,本文介绍kprobes中的另外一种探測技术jprobe.它基于kprobe实现,不能在函数的任何位置插入探測点,仅仅能在函数的入口处 ...
- 004-Maven的安装与配置
1.在Windows上安装Maven 1.1.检查jdk安装 命令行:echo %JAVA_HOME% java -version 1.2.下载Maven 地址:http://maven.apache ...
- Jmeter(八)Jmeter监控tomcat
1.配置tomcat的配置文件conf/tomcat-users.xml 2. 在“线程组”上右键“添加”--“配置元件”--“HTTP授权管理器”,这里主要是让JMeter能够通过Tomcat的基本 ...
- 如何理解PHP的单例模式
单例模式就是让类的一个对象成为系统中的唯一实例,避免大量的 new 操作消耗的资源. PHP的单例模式实现要求: 1.一个private的__construct是必须的,单例类不能在其它类中实例化,只 ...
- Selenium 方法封装 一
Selenium 封装 Selenium 封装 WebDriver对页面的操作,需要找到一个WebElement,然后再对其进行操作,比较繁琐: WebElement element =driver. ...
- __all__方法的作用
在__all__里面写了谁,到时候就只能用谁,其他的用不了,from 模块 import *时就只能用__all__里的 __all__=['test1','Test'] def test1(): p ...
- PKU 2531 Network Saboteur(dfs+剪枝||随机化算法)
题目大意:原题链接 给定n个节点,任意两个节点之间有权值,把这n个节点分成A,B两个集合,使得A集合中的每一节点与B集合中的每一节点两两结合(即有|A|*|B|种结合方式)权值之和最大. 标记:A集合 ...
- fiddler操作改到本地
urlreplace test5.api.bookapi.cn:8889 localhost:8080
- spring cloud 转
http://blog.csdn.net/forezp/article/details/70148833 服务的注册与发现(Eureka) 服务注册(consul) 服务消费者(rest+ribbon ...
- Python学习笔记之Python的多重继承和MixIn
多重继承 继承是面向对象编程的一个重要的方式,因为通过继承,子类就可以扩展父类的功能. 回忆一下Animal类层次的设计,假设我们要实现以下4种动物: Dog - 狗狗: Bat - 蝙蝠: Parr ...