我知道我们可以使用范围解析运算符在C++中显式调用类的构造函数,即className::className().我想知道我究竟需要在哪里打电话.
我基于Cormen's Book上提供的伪代码实现了这种合并排序.我正在复制它,因为它很短:
void merge(vector<double> &array, int start, int mid, int end) {
int i = start;
int j = mid + 1;
int k = start;
vector<double> b(array.size());
while (i <= mid && j <= end) {
if (array[i] <= array[j])
b[k++] = array[i++];
else
b[k++] = array[j++];
}
while(i <= mid)
b[k++] = array[i++];
while(j <= end)
b[k++] = array[j++];
for (k = start; k <= end; k++)
array[k] = b[k];
}
Run Code Online (Sandbox Code Playgroud)
这部分应该是O(n)
而另一个应该是O(n*lg n),其中lg登录2个碱基
void mergeSort(vector<double> …Run Code Online (Sandbox Code Playgroud) 到目前为止,我发现,我完全不了解std :: vector的本质.
让我解释:
矢量是可以增长的,对吧?这意味着,在内部它必须以某种方式动态分配/重新分配内存.像这样的东西:
class vector {
private:
int *data;
};
Run Code Online (Sandbox Code Playgroud)
好的.但是这样的定义意味着如果我们通过引用或值将std :: vector传递给另一个函数 - 这两种类型的参数传递之间没有区别,并且两个函数都能够修改数据(除非vector是作为const传递).
但!我尝试了以下内容,但我的想法失败了:
void try_to_modify(vector<int> v) {
v[2] = 53;
}
int main() {
vector<int> v(3);
v[2] = 142;
try_to_modify(v);
cout << v[2] << '\n'; // output is: 142
return 0;
}
Run Code Online (Sandbox Code Playgroud)
那真相在哪儿?什么std :: vector真的是?
谢谢.