- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在编写一个合并排序函数,现在我只是使用一个测试用例数组(没有输入 - 目前这是静态的)。我不知道如何将数组作为参数传递。这是我现在的代码:
//merge sort first attempt
#include <iostream>
#include <algorithm>
#include <vector>
int mergeSort(int[]);
int main() {
int originalarray[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 10 };
mergeSort(originalarray[]);
}
int mergeSort(int[] originalarray) {
int num = (sizeof(originalarray) / sizeof(int));
std::vector < int > original(num);
if (num > 2) {
return num;
}
// Fill the array using the elements of originalarray
// This is just for demonstration, normally original will be a parameter,
// so you won't be filling it up with anything.
std::copy(originalarray, originalarray + num, original.begin());
// Create farray and sarray of the appropriate size
std::vector < int > farray(num / 2);
std::vector < int > sarray(num - farray.size());
// Fill those using elements from original
std::copy(original.begin(), original.begin() + farray.size(), farray.begin());
std::copy(original.begin() + farray.size(), original.end(), sarray.begin());
mergeSort(farray);
mergeSort(sarray);
}
最佳答案
为了稍微扩展一下,请记住 C++ 数组正是 C 数组。所以你所拥有的只是一块声称(不保证)是一个数组的内存的地址。
更新
好的,我们再扩展一点。
C(以及因此 C++)并没有真正的“数组”。它只有地址和指针。因此,当您将某些东西创建为“数组”时,真正发生的事情是您告诉编译器某个变量表示一个地址。
在 C 语言中区分声明和定义很有用。在声明中,你只是给某物一个名字和一个类型;在定义中,您实际上分配了空间。
所以,如果我们从定义一个数组开始
int ar[100];
这意味着我们告诉编译器我们想要 100
int
的空间的,我们希望它全部分配在一个块中,我们将使用名称
ar
为了它。
sizeof
运算符给出类型或对象使用的字节数,所以我们的数组
ar
将占用 100×
sizeof(int)
字节。在大多数机器上,这将是 400 字节,但它因机器而异。
int * ar_p; // using '_p' as a reminder this is a pointer
我们正在为包含地址的变量定义空间。它的大小将是
sizeof(int*)
,通常是 4 或 8,但在某些机器上可能是 2 到 16,而在某些机器上,您不太可能很快遇到。
ar
.编译器将该名称转换为地址,因此我们可以使用以下命令保存该地址
ar_p = ar ; // THIS WORKS
现在,为了方便起见,我们假设我们的数组
ar
碰巧从内存中的位置 1000 开始。
ar
没有分配给它的任何空间;它就像一个常数,一个数字。所以,你不能撤销那个分配
ar = ar_p ; // THIS WON'T WORK
出于同样的原因,你不能说
1000 = ar_p ; // THIS WON'T WORK EITHER
即,您不能更改 1000 的值。(在 FORTRAN 的早期版本中,由于复杂的原因,这个技巧会起作用。这是一个错误。直到您尝试调试其中“2”的值为 3。)
ar[0]
只是地址 1000 加上 0 字节的偏移量,或 1000。
ar[1]
是 1000 加上
int
大小的 1 倍,这样下一个int就结束了。事实上,这在 C 中总是正确的。
*ar_p
我们告诉编译器获取包含在
ar_p
中的地址的东西. `.
ar_p = ar;
然后
*ar_p
和
ar[0]
指同一件事。
ar[0]
我们告诉编译器我们想要来自
ar
的地址 0 字节处的东西.
ar[1]
是地址一
int
,或 4 个字节,来自
ar
.所以,
*(ar_p+3)
指的是与
ar[3]
相同的东西. (我们需要括号,因为我们要先在地址上加 3,然后再查看内容。
*ar_p+3
将首先获取
ap_p
指向的内容,然后将其加 3。
ar[365]
,编译器会很高兴地生成代码来查看单元格 1000+(365×
sizeof(int)
)。如果它在您的数组中,那很好,但如果它只是随机内存,那也很好。 C 不在乎。
foo(TYPE t[])
≡ foo(TYPE * t)
void foo(int[] ar){
或者
void foo(int* ar){
并获得完全相同的效果。
t[i]
≡ *(t+i)
ar[i]
,您可以将其替换为
*(ar+i)
. (实际上有一个奇怪的侧面案例打破了这一点,但作为初学者你不会遇到它。)
TYPE *t
, (t+i)
将等于 t
处的地址加i*sizeof(TYPE)
ar[42]
,这意味着您想要从起始地址开始的第 42 个。所以,如果你使用
int
,那么你需要移动超过 42 次,无论宽
int
是,也就是说
sizeof(int)
.
TYPE
是重载 operator[]
的用户定义类型和 operator*
. 关于c++ - 在 C++ 中将数组作为参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/763861/
这个问题在这里已经有了答案: How to initialize var? (11 个答案) 关闭 8 年前。 我想给一个变量赋初值 null,并在下一个 if-else block 中赋值,但是编
我正在使用 TypeScript 3.8 编写 JS 和 TS 混合的代码。我写了以下行: export * as Easing from './easing'; 应该是 fair game在 Typ
我需要将 R 代码中的“/”更改为“\”。我有这样的事情: tmp <- paste(getwd(),"tmp.xls",sep="/") 所以我的 tmp是 c:/Study/tmp.xls 我希望
我有个问题。例如我有这个: id truth count 1 1 1 2 1 2 3 0 0 4 1 1 5 1 2 6 1
我正在尝试使用“IN”和“=”来查找一些 bean。我目前正在使用此代码: $ids = array(1,2,3,4); $user = 1; $things = R::find( 'thing'
是否可以在 Xcode 中部署到其他人的手机上?我没有 iPhone,但我想测试我在 friend 手机上制作的应用程序。在我支付 99 美元之前,我想确保这不会造成麻烦。 谢谢。 最佳答案 不会有任
我试图得到一个非常大的数字(超过 unsigned long long int )。所以我把它作为一个字符串,然后一个数字一个数字地转换成整数并使用它。 #include #include int
我在 Rust 中有 C 语言库的绑定(bind),但它们并不完整。 在 C 代码中,我定义了一个简化的宏,如下所示: #define MY_MACROS1(PTR) (((my_struct1
我正在努力解决这个问题。 http://jsfiddle.net/yhcqfy44/ 动画应该自动相对于 滚动到顶部每次出现滚动条时的高度。 我已经写了这个,但没有运气: var hheight =
我正在处理一个将数字作为字符串返回的 JSON API。例如 "12" ,但是,该字段值也可以是非数字的,例如:"-" . 我已将 JSON 数据解析为映射,我想将此字段提取为 elixir 中的整数
我正在尝试编写一个类,将.wav文件转换为.aiff文件作为项目的一部分。 我遇到了几个库Alvas.Audio(http://alvas.net/alvas.audio,overview.aspx)
我想在 Lucene 中将像“New York”这样的“复合词”索引为单个术语,而不是像“new”、“york”那样。这样,如果有人搜索“new place”,则包含“new york”的文档将不会匹
我希望这个解释能让我更好地了解使用宏的优点。 最佳答案 在函数中,所有参数在调用之前都会被评估。 这意味着 or 作为函数不能是惰性的,而宏可以将 or 重写为 if 语句,该语句仅在以下情况下计算分
我有一些看起来像这样的 XML foo ]]> (注意 > 登录 "> foo")和 XSLT 样式表 当我运行xsltproc stylesheet.xs
当我尝试将 Any 转换为 List 时,如下面的示例所示,我得到“Unchecked cast: Any!”到列表'警告。有没有解决此类问题的方法? val x: List = objectOfTy
我正在使用 Python 开发一个简单的爬虫。目的是创建一个 sitemap.xml。(你可以在这里找到真正的 alpha 版本:http://code.google.com/p/sitemappy/
我想知道在 VBScript 中是否可以在多行中中断 If 语句。喜欢: If (UCase(Trim(objSheet.Cells(i, a).Value)) = "YES") Or _ (UCas
for (String item : someList) { System.out.println(item); } 使用“do while”是否等效? 谢谢。 最佳答案 如果列表为空,f
这个问题已经有答案了: 已关闭10 年前。 Possible Duplicate: Split string with delimiters in C 在 C 中将“,”分隔的列表拆分为数组的最佳方法
我有一个如下所示的字符数组: [0, 10, 20, 30, 670] 如何将此字符串转换为整数数组? 这是我的数组 int i=0; size_t dim = 1; char* array = (c
我是一名优秀的程序员,十分优秀!