1. 程式人生 > >std::list/vector 作為函式引數的傳遞方式

std::list/vector 作為函式引數的傳遞方式

       專案中的一個小bug。主觀性認為 std::list 作為函式引數,是按指標傳遞的,實際還是按值傳遞的(不解!!)。 舉例如下

  1 #include <iostream>

  2 #include <list>

  3 

  4 usingnamespace std;

  7 /*version 1: transfer pointer of list */

  8 /*

  9 void update(list<int>* b){

 10 

 11         for(list<int>::iterator piter = b->begin(); piter != b->end(); piter++)

 12         {

 13                 (*piter)++;

 14         }

 15 }

 16 */

 17 

 18 /*version2: transfer list */

 19 /*void update(list<int> b){

 20 

 21         for(list<int>::iterator piter = b.begin(); piter != b.end(); piter++)

 22         {

 23                 (*piter)++;

 24

        }

 25 }

 26 */

 27 

 28 /*version 3:transfer reference of list*/

 29 void update(list<int>& b){

 30 

 31         for(list<int>::iterator piter = b.begin(); piter != b.end(); piter++)

 32         {

 33                 (*piter)++;

 34         }

 35 }

 39 

 40 int main()

 41 {

 42         list<int> a(4, 100);

 43 //      list<int>* b = &a;

 44         update(a);

 45 

 46         for(list<int>::iterator piter=a.begin(); piter != a.end(); piter++)

 47         {

 48                 cout << "updated list " << *piter << endl;

 49         }

 50 }

    上述 update函式的引數設計為  list<Int>,  結果是 main()中 呼叫 update(a)之後, a 的值 並沒有被修改;設計成 list<int>* ,才能修改main中的a值。

    同理,將list換成vector,發現vector也是按值傳遞的。這跟潛意識裡面想法,“陣列名作為引數,按指標/引用傳遞” 全然不同。

    設計修改main中變數的子函式,需要指標/引用傳參;否則就用傳值。另外,std list/vector類,確實同基本型別(int, float)規則一致。

相關推薦

std::list/vector 作為函式引數傳遞方式

       專案中的一個小bug。主觀性認為 std::list 作為函式引數,是按指標傳遞的,實際還是按值傳遞的(不解!!)。 舉例如下   1 #include <iostream>   2 #include <list>   3 

C語言指標作為函式引數傳遞學習(一)

1. 一維指標做函式引數 傳入的指標為NULL 比如下面的例子,很多人都會理解錯: #include <stdio.h> void test(char *string) { string = "hello world"; } int main() { cha

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

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

從組合語言進一步瞭解C++三種函式引數傳遞方式

首先我們要知道,計算機對資料的處理是不斷定址、讀寫資料的過程。上升到程式層面,一個個函式在組合語言中就是一段段彙編指令,這些彙編指令讓計算機通過暫存器在記憶體中訪問指定記憶體塊地址並從中讀寫資料。除全域性變數和其它一些形式定義的變數外,函式中的變數都存在棧記憶體中,程式對變數的修改、傳遞等一系列操作都是暫存

c++之指標作為函式引數傳遞的問題

轉自:http://blog.csdn.net/fjb2080/article/details/5623427   原創文章,轉載請註明出處,謝謝! 作者:清林,部落格名:飛空靜渡   部落格地址:http://blog.csdn.net/fjb2080 &n

指標作為函式引數傳遞 (轉載)

這幾天在學習C過程中,在使用指標作為函式引數傳遞的時候出現了問題,根本不知道從何得解:原始碼如下:    createNode(BinNode *tree,char *p)    {        tree = (BinNode *) malloc(sizeof(BinNo

結構體變數和結構體指標變數作為函式引數傳遞的問題

/*2015年8月28日13:20:28通過函式完成對結構體變數的輸入和輸出*/# include <stdio.h># include <string.h>struct Student{int age;char sex;char name[100];

二維陣列作為函式引數傳遞(C++)

有時候我們也許會不明白為什麼C++中的陣列宣告的時候下標是需要一個常數,而不能是一個變數吶?也許STL模板庫中的向量可以解決變數作為下標的陣列宣告方式,為了節約一些記憶體或者是提高一些效能,也為了功能不重複,故而陣列中的下標採取了常量的方式。 int a[

陣列作為函式引數傳遞

陣列有兩個特殊的性質。一是不能複製陣列;二是使用陣列名字時,陣列會自動轉化為指向其第一個元素的指標。由於陣列不能複製,所以無法編寫使用陣列型別形參的函式,因為陣列會被自動轉化為指標。 一、一維陣列 1.三種定義形式: void printvalues(int *); vo

shell指令碼引數傳遞和main函式引數傳遞方式類似

shell指令碼 test.sh呼叫的時候傳入引數,param1,param2: #test.sh param1 param2 那麼在指令碼內部相當於把 test.sh param1 param2 看成三個引數出入,所以引數0為$0 (test.sh),引數1為$1 (pa

指標作為函式引數傳遞的問題

今天程式設計時遇到了一個問題,就是想寫一個函式,讓這個函式通過引數返回記憶體某一個緩衝區的首地址。在網上找了找,發現以下這段程式碼比較有代表性, 於是複製過來作為一個總結說明。 下面這段程式碼是正確的,這段程式碼通過函式申請一片記憶體區,並將申請到的記憶體首地址返回給呼叫函

關於Python函式引數傳遞方式--值傳遞?引用傳遞

渣渣我在學習中遇到的一點問題,特地貼出來,由於我水平渣,所以如有問題,請多指教 經過測試可以發現: python3 不允許我們選擇引數傳遞方式,但是他已經全部採用了引用傳遞。有幾點需要注意: 1.引用傳遞可以當做值傳遞使用,只是你需要把他賦值給一個臨時變數副本,不要直接使

結構體指標作為函式引數傳遞卻無法傳值的有關問題

今天做C++作業遇到一個問題,需要寫一個函式(在連結串列中新增新的節點)將結構體指標作為形參,結果發現傳遞之後無法改變結構體的值,連結串列的長度還是沒變。通過查詢資料,發現把形參改為對結構體指標的應用即可解決問題。 原始碼: struct Tnode { strin

C語言中如何將陣列作為函式引數傳遞

今天覆習到c語言的陣列,看到這麼一個問題: 現在,你的程式要讀入兩個多項式,然後輸出這兩個多項式的和,也就是把對應的冪上的係數相加然後輸出。 程式要處理的冪最大為100。 輸入格式: 總共要輸入兩個多項式,每個多項式的輸入格式如下: 每行輸入兩個數字,第一個表

C++ 之std::function() 作為函式引數入口 詳解

1. 關於std::function() 在C語言的時代,我們可以使用函式指標來吧一個函式作為引數傳遞,這樣我們就可以實現回撥函式的機制。到了C++11以後在標準庫裡引入了std::function模板類,這個模板概括了函式指標的概念 函式指標只能指向一個函式,而std::function物件可

python函式的四種引數傳遞方式

fun1(a,b,c) fun2(a=1,b=2,c=3) fun3(*args) fun4(**kargs) 直接將實參賦予行參,根據位置做匹配。 根據鍵值對的形式做實參與行

C語言中函式引數傳遞的兩種方式

問題及程式碼: /* *完成日期:2018.10.2 * *問題描述:c語言函式引數傳遞的兩種方式 * */ #include <stdio.h> void swap1(int x, int y); //對交換函式myswap1的提前宣告 (傳值

C++函式引數傳遞的3種方式以及優缺點(轉)

寫函式時遇到給予函式的引數變數無法被修改的問題,轉自:https://blog.csdn.net/zhaoxun91/article/details/75417492 1 函式引數傳遞的3種方式比較 1.1 按值傳遞 #include <iostream> using names

把tuple或者list裡的元素作為函式引數傳入

1、tuple或list中的所有元素傳入一個函式的引數列表中: 需求函式如下: tuple = (1, "foo", "bar") def myfun(number, str1, str2): return (number * 2, str1 + str2, str2 + st

C語言經典例題--結構體指標變數作為函式引數傳遞

#include <stdio.h> #include <string.h> struct student { int age; char sex; char name[30]; }; void inputstudent(struct stu