说来惭愧,一道简单的对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总结的更多相关文章

  1. c++ vector 的坑

    一个空的vector执行pop_back操作会发生什么 由于之前看STL源码剖析的时候,发现所执行的操作如下: 只是简单的将末尾的finish迭代器减1后destroy.这让人产生一个疑问:假如这个v ...

  2. [转载]Vector用法(C++ Primer中文版)

    转自:http://blog.sciencenet.cn/blog-261330-551086.html vector 是同一种类型的对象的集合,每个对象都有一个对应的整数索引值.和 string 对 ...

  3. C++primer 练习11.33:实现你自己版本的单词转换程序

    // 11_33.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...

  4. C++ Primer 5th 第3章 字符串、向量和数组

    *****代码在Debian g++ 5.40 / clang++ 3.8(C++11)下编写调试***** 本章主要是关于字符串.数组的内容,以及一些简单的容器知识. 1.using的声明 usin ...

  5. Java 集合系列之 Vector详细介绍(源码解析)和使用示例

    Vector简介 Vector 是矢量队列,它是JDK1.0版本添加的类.继承于AbstractList,实现了List, RandomAccess, Cloneable这些接口. Vector 继承 ...

  6. Vector源码解析

    概要 学完ArrayList和LinkedList之后,我们接着学习Vector.学习方式还是和之前一样,先对Vector有个整体认识,然后再学习它的源码:最后再通过实例来学会使用它.第1部分 Vec ...

  7. Java集合--Vector

    转载请注明出处:http://www.cnblogs.com/skywang12345/p/3308833.html 第1部分 Vector介绍 Vector简介 Vector 是矢量队列,它是JDK ...

  8. Fundamentals of Computer Graphics 中文版(第二版) (Peter Shirley 著)

    1 引言 2 数学知识 3 光栅算法 4 信号处理 5 线性代数 6 矩阵变换 7 观察 8 隐藏面消除 9 表面明暗处理 10 光线追踪 11 纹理映射 12 完整的图形流水线 13 图形学的数据结 ...

  9. 【LeetCode】2020-04 每日一题

    8. 字符串转换整数 (atoi)(中等) [分类]:模拟.正则表达式 [题解]: 解法1:直接模拟,但是在判断INT_MAX和INT_MIN上需要注意,因为直接判断会超出范围,所以可以将式子转换一下 ...

随机推荐

  1. Python的15个坑

    1. 不要使用可变对象作为函数默认值 代码如下: In [1]: def append_to_list(value, def_list=[]):    ...:         def_list.ap ...

  2. notepad快捷键总结

    notepad快捷键总结 常用快捷键: 快捷键 功能1.Ctrl-D 复制当前行2.Ctrl-L 删除当前行3.Ctrl-T 把当前行和前面一行调换位置4.F11 切换全屏模式5.Ctrl-Shft- ...

  3. iOS开发- 速学Swift-中文概述

    Swift是什么? Swift是苹果于WWDC 2014公布的编程语言,这里引用The Swift Programming Language的原话: Swift is a new programmin ...

  4. Spark2.0 Pipelines

    MLlib中众多机器学习算法API在单一管道或工作流中更容易相互结合起来使用.管道的思想主要是受到scikit-learn库的启发. ML API使用Spark SQL中的DataFrame作为机器学 ...

  5. TensorFlow学习笔记(一)--windows系统安装配置

    1.关于Tensorflow 国际惯例,先来个总体的简要介绍,摘自一个很强大的TensorFlow中文学习网站(http://www.tensorfly.cn/)的简介 TensorFlow™ 是一个 ...

  6. POJ1088:滑雪(简单dp)

    题目链接:  http://poj.org/problem?id=1088 题目要求: 一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小.求可以滑落的最长长度. 题目解析: 首先要先排一 ...

  7. Does Daemon Thread Exit with Main Thread?

    主线程(进程)退出后,主线程创建的守护线程也会退出吗? 通过下面的代码测试: Demo1: 进程创建普通线程 #!/usr/bin/python3 # FileName: daemonThread.p ...

  8. 设备驱动与控制器 I/O

    控制器是对硬件发起控制命令,负责给系统提供接口,想要正常使用该硬件功能系统中必须安装相应驱动 I/O设备 cpu和存储器并不是操作系统唯一需要管理的资源,I/O设备也是非常重要的一环. I/O设备一般 ...

  9. Linux系统——源码编译安装

    记得要先去把httpd-2.2.9.tar.gz通过xftp进行文件传输第一步:yum仓库下安装编译环境的支持程序 #yum -y install gcc gcc-c++ make 第二步:将源码包h ...

  10. JsonObject没有fromObject、idea引入maven有红线没依赖、JsonObject maven 依赖包

    目录: 1.JsonObject maven 依赖包 2.idea引入maven有红线,没依赖 3.JsonObject没有fromObject \\\\\\\\\\\\\\\\\\\\\\\ 1.J ...