我开始在学校最后一年开始之前检查数据结构和算法,以确保我掌握一切.一个评论问题说"使用链表或动态数组实现堆栈并解释为什么你做出了最好的选择".
对我来说,使用带有尾指针的列表来实现堆栈似乎更直观,因为它可能需要经常调整大小.对于大量数据来说,列表是更好的选择,因为动态数组重新调整大小是一项昂贵的操作.此外,使用列表,您不需要分配比实际需要更多的空间,因此它更节省空间.
但是,动态数组肯定允许更快地添加数据(除非需要调整大小).但是,我不确定使用数组是否整体更快,或者只是不需要调整大小.
该书的解决方案说"存储非常大的对象,列表是一个更好的实现",但我不明白为什么.
哪种方式最好?应该使用哪些因素来确定哪种实施方式"最佳"?还有,我的逻辑是什么?
performance stack linked-list dynamic-arrays data-structures
这里有两个相关的问题:
A)如何实现枚举?例如,如果我有代码:
enum myType
{
TYPE_1,
TYPE_2
};
Run Code Online (Sandbox Code Playgroud)
究竟发生了什么?我知道您可以将TYPE_1和TYPE_2视为整数,但它们实际上只是整数?
B)基于该信息,假设传入的枚举不需要更改,将myType作为值或const引用传递给函数会更有意义吗?
例如,哪个是更好的选择:
void myFunction(myType x){ // some stuff }
Run Code Online (Sandbox Code Playgroud)
要么
void myFunction(const myType& x) { // some stuff }
Run Code Online (Sandbox Code Playgroud) 所以,我对OCaml完全不熟悉,并且在实现我的第一个函数方面进展缓慢.我理解困难的一件事是何时使用模式匹配能力
let foo =
[] -> true
| _ -> false;;
Run Code Online (Sandbox Code Playgroud)
vs使用if else结构
let foo a =
if a = [] then true else false;;
Run Code Online (Sandbox Code Playgroud)
我什么时候应该使用?
当我使用地图时,值肯定会被初始化为默认值,还是我不应该依赖它?
例如,假设我有以下代码:
map<string, int> myMap;
cout << myMap["Hey"];
Run Code Online (Sandbox Code Playgroud)
这将使用我的编译器输出"0".这是保证的行为吗?这可能不会总是初始化为0吗?
例如,出于某种原因,我说有一段看起来像这样的代码:
mutable std::vector<std::vector<std::vector<std::vector<
std::vector<MyNamespace::MyType> > > > > myFreakingLongVectorThing;
Run Code Online (Sandbox Code Playgroud)
我收到的警告看起来像这样:
C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\xstring(1665) : warning
C4503: 'std::vector<_Ty>::operator []' : decorated name length exceeded, name was truncated
with
[
_Ty=std::vector<std::vector<std::vector<std::vector<std::vector<MyNamespace::MyType>>>>>
]
Run Code Online (Sandbox Code Playgroud)
有没有什么方法可以重写那个怪异的长矢量的东西,以免得到那个警告?我仍然希望数据结构相同,但不要得到那个警告.我不想禁用警告.可能?
注意:这是Visual Studio 2005
....如果你真的很好奇为什么我正在使用这种可怕的数据结构,它是由自动生成的代码引起的.
我试图将一个函数作为参数传递给另一个函数,它们都碰巧是同一个类的成员函数.
我得到一个奇怪的错误,我无法弄清楚问题是什么.
这是我的功能:
void myClass::functionToPass()
{
// does something
}
void myClass::function1(void (*passedFunction)())
{
(*passedFunction)();
}
void myClass::function2()
{
function1( &myClass::functionToPass );
}
Run Code Online (Sandbox Code Playgroud)
但是,我收到以下错误:
cannot convert parameter 1 from 'void(__thiscall myClass::*) (void)'
to 'void(__cdecl*)(void)'
Run Code Online (Sandbox Code Playgroud)
什么给出了什么?我觉得我已尝试过各种变化,试图让它发挥作用.你甚至可以传递成员函数的函数指针吗?我怎样才能让它发挥作用?
注意:使functionToPass静态不是一个真正有效的选项.
有没有办法在OCaml中定义函数之前声明一个函数?我正在使用OCaml解释器.
我有两个功能:
let myFunctionA =
(* some stuff here..... *) myFunctionB (*some stuff *)
let myFunctionB =
(* some stuff here .... *) myFunctionA (* some stuff *)
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为myFunctionA在制作之前无法调用myFunctionB.
我做了一些谷歌搜索,但似乎找不到任何东西.我怎么能做到这一点?
ocaml functional-programming function mutual-recursion function-declaration
我是一个完整的Java菜鸟.我知道Java将所有参数视为按值传递,并且还有其他一些线程可供人们解释.
例如,在C++中我可以这样做:
void makeAThree(int &n)
{
n = 3;
}
int main()
{
int myInt = 4;
makeAThree(myInt);
cout << myInt;
}
Run Code Online (Sandbox Code Playgroud)
哪个将输出3.我知道在Java中,所有参数都是按值传递的,因此您无法操纵传入的参数.是否有一种标准的方法来模拟 Java中的引用传递?有没有办法调用一个操作传入的变量的函数?我很难理解无法做到这一点的想法.
对于家庭作业,我们已被指示完成任务而不引入任何"副作用".我在维基百科上查找了"副作用",虽然我从理论上说它意味着"修改一个状态或者与调用函数有一个可观察的交互",但我很难搞清楚具体细节.
例如,创建一个保存非编译时间结果的值会引入副作用吗?
说我有(可能在语法上不完美):
val myList = (someFunction x y);;
if List.exists ((=) 7) myList then true else false;;
Run Code Online (Sandbox Code Playgroud)
这会引入副作用吗?我想也许我对"修改状态"在副作用定义中意味着什么感到困惑.
我正在制作一个" 点和盒子 "程序,其中输入是由计算机自动生成的,我们的输出是我们将要做的动作.我将与另一个玩家(他们的算法)竞争.
我将点和框板表示为Python中的矩阵.赢得游戏是首要任务:算法效率并不重要.
在给定电路板的情况下,是否有最好的,不复杂的算法来自动确定我们应该采取什么措施?
PS - 如果你想要的话,你不需要给我任何代码......英语算法是完全可以接受的.
c++ ×4
ocaml ×3
performance ×2
algorithm ×1
enums ×1
function ×1
if-statement ×1
java ×1
linked-list ×1
map ×1
python ×1
side-effects ×1
stack ×1
stl ×1
visual-c++ ×1
warnings ×1