这篇文是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];