Re: [問題] 用指標指向vector的element?

作者: wtchen (沒有存在感的人)   2016-06-19 03:06:29
這篇文是2010年發的,因為最近遇到相似的問題想來請教。
我正在練習merge sort,用C很好寫,原始碼在此:
https://gist.github.com/gnitnaw/6ab90fbad5b2c07cb28fbe4b42ae3306
用divide & conquer的步驟是這樣:
array size >=3的話,拆兩半,這個用pointer很簡單,
就把它變成兩個pointer,一個擺array[0],另一個擺array[N/2]。
可是如果用C++改寫就不一樣了。
由於array size很大,如果用vector,由於它可能不是連續空間,
我不能用pointer或reference把vector分成兩半。
就變成只能用copy vector的方式(那我得copy log_2(100000)次....)
還是我能用new一個size = 100000的array?
不知道C++的array是不是連續空間?可不可以用pointer指向該array中的某元素?
對C++11以後仍然不是很熟,還在練習中(汗),請多指教。
PS: 我知道C++還是可以用C的語法,不過我想儘可能用C++11以後的語法。
※ 引述《zxvc (執著)》之銘言:
: 我想讓"指標""一直"指向某個vector的元素,
: 請問有無可能。
: 事實上這在VC是不行的。
: 我知道vector可能發生reallocate memory的情形。
: 所以就算某個指標某個時候指向vector的一個element,
: 一旦有reallocate的情形(如某次push_back),
: 就不再保證指向同一個element。例如以下code在VC會出現執行時期錯誤:
: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
: #include<iostream>
: #include<vector>
: int main()
: {
: vector<int> v;
: v.push_back(0);
: int *p = &(*(v.begin()));
: v.push_back(1);
: cout<<*p; // error!
: }
: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
: #include<iostream>
: #include<vector>
: int main()
: {
: vector<int> v;
: v.push_back(0);
: vector<int>::iterator p = v.begin();
: v.push_back(1);
: cout<<*p; // error!
: }
: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
: 甚至不用指標,改用iterator,也一樣會出問題。
: 所以請問除了指標、iterator,難道只剩index可以一直指向vector同一個element嗎?
: index的用法如:
: int p = 0;
: cout<<v[p];
作者: fatrabitree (胖兔子)   2016-06-19 03:40:00
Vector 是連續空間阿New也是連續空間,這都不算c++11的新特性
作者: wtchen (沒有存在感的人)   2016-06-19 04:17:00
所以我可以用指標指到vector裡面的element?
作者: CoNsTaR ((const *))   2016-06-19 05:59:00
可以啊 只是新增元素之後原來的指標就可能失效
作者: FRAXIS (喔喔)   2016-06-19 07:02:00
你應該只需要 index 而不需要真的指標吧
作者: steve1012 (steve)   2016-06-19 07:59:00
應該不需要用Pointer
作者: weiclin (CC)   2016-06-19 09:16:00
作者: Caesar08 (Caesar)   2016-06-19 10:28:00
The elements are stored contiguously,... since C++03
作者: wtchen (沒有存在感的人)   2016-06-20 15:10:00
是我被pointer寵壞了....感謝

Links booklink

Contact Us: admin [ a t ] ucptt.com