1. 程式人生 > >c++(vector)問題

c++(vector)問題

前言

從大學到現在的時候一直在用c, c++接觸的甚少,並且也從未系統的學習過,因此最近一直閱讀c++primer(第五版)

問題

在看到第六章的時候碰到的一道練習題:要求用遞迴輸出vector的物件內容,當時一考慮後寫下的程式碼:

#include "common.h"

int print(vector<int> ivec, vector<int>::iterator iter)
{
        if(iter != ivec.end())
        {
                cout<<"recursive output:"
<<*iter<<endl; print(ivec, ++iter); } return 0; } int main() { int arry[5] = {1,2,3,4,5}; vector<int> ivec1(arry, arry+5); print(ivec1, ivec1.begin()); }

編譯執行後發現遞迴一直在進行,認真查看了程式碼,在當時並沒有看出什麼問題。無奈之下,只能通過gdb除錯,在函式print打了斷點了,發現遞迴函式print每次傳的ivec.end()都不一樣,所以導致了遞迴的基準情形失去了作用,所以遞迴函式無法返回。

解決

為什麼print函式的形參ivec.end()每次都不一樣呢?其實在c++prime裡面已經明確的說明了,函式的形參是通過傳遞的實參進行初始化,這就是說,print函式中的形參ivec每次都被初始化賦值了,而vector是支援初始化賦值,此時類似新建立了一個vector,並且用上一個的vector進行拷貝初始化,這也間接導致了ivec.end()每一次都不一樣。在找到問題後,修改後也就容易了。

int print(const vector<int> &ivec, vector<int>::iterator iter)
{
        if(iter != ivec.end())
        {
                cout
<<"recursive output:"<<*iter<<endl; print(ivec, ++iter); } return 0; }

遞迴函式print用了vector的引用,這也就保證了每次傳遞到函式裡的形參都指向同一個vector物件。編譯執行後,問題解決。

總結

其實這是一個很小,很基礎的問題,可問題的關鍵在於似乎自己忘掉了這些基礎(^^囧^^)。不過意識到問題,問題就好解決了,就如這個問題一樣,找到問題關鍵,解決便輕而易舉。

相關推薦

c++vector問題

前言 從大學到現在的時候一直在用c, c++接觸的甚少,並且也從未系統的學習過,因此最近一直閱讀c++primer(第五版)。 問題 在看到第六章的時候碰到的一道練習題:要求用遞迴輸出vector的物件內容,當時一考慮後寫下的程式碼: #includ

C++】向量vector 基本使用方法及注意事項

介紹: 向量(Vector)是一個封裝了動態大小陣列的順序容器(Sequence Container)。跟任意其它型別容器一樣,它能夠存放各種型別的物件。可以簡單的認為,向量是一個能夠存放任意型別的動態陣列。 特點: 1.順序序列 順序容器中的元素按照嚴格的線性順序排序。可以通過元素

C++ 向量vector

1. vector介紹 向量 vector 是一種物件實體, 能夠容納許多其他型別相同的元素, 因此又被稱為容器。 與string相同, vector 同屬於STL(Standard Template Library, 標準模板庫)中的一種自定義的資料型別, 可以廣義上認為是

C++筆記容器(vector)作為函式引數如何傳參

一、大致以下型別 void 函式名( vector< int> obj ); void 函式名( vector< int>* pobj ); void

C3

i+1 不能 () 可能 實現 空格 i++ 輸出 輸入 多次運用循環,條件語句,定義數組,排序 旅行團需要租帆船進行冒險活動,一條帆船最多乘坐兩人,且乘客的總重量不能超過帆船的最大載重。為盡可能的減少活動花銷,你要找出最少帆船條數。現寫一個程序,輸入帆船的最大載重(應大於

effective c++

ret 內存不足 賦值 指向 enc 工作 cti sig 操作符 條款10:令operator=返回一個reference to *this 為了實現“連鎖賦值”,賦值操作符必須返回一個reference指向操作符的左側實參,這是你為classes實現賦值操作符時應該遵循

C# C Sharp

無法 文件存儲 選項卡 主函數 one 背景 選擇 數據 過程 C#(C Sharp)是一門編程語言,是DoNet的核心語言,是用來和計算機對話溝通的語言。 編程過程就是對計算機下命令的過程,這些命令寫出來就是代碼。 Visual Studio 是DoNet軟件開發的編程

2014年8月25日,收藏家和殺手——面向對象的C++和C

creat os x tracking -m end gin 知識 數據 我們 近期事情特別多,睡眠也都非常晚,有點精神和身體混亂的感覺,所以想寫寫技術分析文章。讓兩者的我都調整一下。這篇技術分析文章是一直想寫的,當前僅僅是開篇,有感覺的時候就寫寫,屬於拼湊而成,興

碼海拾遺:簡述C++

成員 不同 font 面向過程 用戶 style 基本 color size   C++是Bjarne Stroustrup博士於1982年,在C語言的基礎上引入並擴充了面向對象的概念後發明的一種新的程序語言。就與C語言的淵源而言,C++可以說是C語言的超集,它兼容C的一切

洛谷——P2371 EXCEEDED WARNING C50

++ 溢出 getch i++ number clas def 得到 splay P2371 EXCEEDED WARNING C 題目背景 第三道溢出警告。。。 機(wei)智(suo)的TMXi又搬題來坑大家了。。。 註意時空限制【壞笑】 題目描述 [li]

c++002學習輸入cin

std name sin cout using urn clu col str 學習了輸入cin的使用 1 #include <iostream> 2 #include <cstdlib> 3 4 using namespace st

逆向分析c++ string

c++在c++中string是一個類 現在用od分析它分析結果 為它是一個結構體 #include<iostream> //#include<afx.h> using namespace std; struct MyStruct { MyStruct* pself;

Linux後臺進程管理以及ctrl+z掛起、ctrl+c中斷、ctrl+退出和ctrl+dEOF的區別(轉)

列表 art 信息 csdn 而是 png detail tps 後臺 一、後臺進程管理命令 fg、bg、jobs、&、ctrl + z、ctrl + c、ctrl + \、ctrl + d1、 &加在一個命令的最後,可以把這個命令放到後臺執行 ,如fire

向量vector

數組 抽象數據類型 實現 find 組元 pan 結構 遞增 線性 1.接口與實現 1.1 抽象數據類型:一組數據模型上定義的一組操作 數據類型是(char、int等) 數據結構:基於特定語言的,實現ADT的一整套算法。 1.2 向量:向量是數組的抽象與泛化,由一組元

C++— 虛函數

str arch 抽象 實例 都是 方法 tree sid 動態聯編 1、虛函數   原因:通過指針調用成員函數時,只能訪問到基類的同名成員函數。在同名覆蓋現象中,通過某個類的對象(指針及引用)調用同名函數,編譯器會將該調用靜態聯編到該類的同名函數,也就是說,通過基類對象指

標準C++1

esp 數組 nbsp 重載 ostream names ++ 釋放內存 操作 一、引用 引用就是某一變量(目標)的一個別名,對引用的操作與對變量直接操作完全一樣。 引用的聲明方法:類型標識符 &引用名=目標變量名;   例: int& num;  引用類似

標準C++4繼承

特性 class a 調用 同名 clas 父類 基類 pre 類中訪問 一、繼承的作用 若A類繼承了B類,可以使A類獲得B類中的部分成員變量和成員函數,這能使程序員在已有類的基礎上重新定義新的類。繼承是類的重要特性,當A類繼承了B類,我們稱A類為派生類或子類,B類為基類或

Silverlight & Blend動畫設計系列十:Silverlight中的坐標系統Coordinate System與向量Vector運動

過度 highlight 圖片 nbsp mgr ack jpg .com bsp 原文:Silverlight & Blend動畫設計系列十:Silverlight中的坐標系統(Coordinate System)與向量(Vector)運動  如果我們習慣於數學坐

自制JSON解析庫C++--對JavaScript物件的理解

JSON只有兩種結構:鍵值對和陣列;它們之間可以相互巢狀,形成樹形結構,葉子節點有字串、數字、false、true、null。     在這之前,首先談談對JavaScript核心思想的理解:   在JS的世界裡,沒有類,只有物件,物件怎麼來,通

c# ?:語法

return a == 1 ? 2 : 3; //返回的2 return a = 1 ? 2 : 3;//在c#中程式會報錯 由此上述兩個表示式,我整理了一下關於這個運算子相關的點 ///////////////////////////