我在C++中编写了一个匿名的阶乘函数,并用g ++ 4.9.2编译了我的代码.它运作良好.但是,我不知道我的功能类型.
#include<iostream>
#include<functional>
using std::function;
int main()
{
//tested at g++ 4.9.2
//g++ -std=c++1y -o anony anony.cpp
auto fac = [](auto self,auto n)->auto{
if(n < 1)
return 1;
else
return n * self(self,n-1);
};
std::cout<<fac(fac,3)<<std::endl;//6
return 0;
}
Run Code Online (Sandbox Code Playgroud)
所以,我想知道:什么类型fac和self?如果我只是将C++代码翻译成Haskell,它将无法编译,因为它涉及无限类型:
fac2 self 0 = 1
fac2 self n = n * (self self $ n-1)
Run Code Online (Sandbox Code Playgroud)
我必须定义一些递归类型的工作:
data Y a = Y ((Y a)->a->a)
fac2 self 0 = 1
fac2 self n = n * ((applY …Run Code Online (Sandbox Code Playgroud) 当我想使用std :: random生成随机数时,我更喜欢哪种引擎?的std::default_random_engine还是std::mt19937?有什么区别?
我自己构建了我的共享库(我使用lib计算斐波纳契数),并希望在我的另一个c ++项目中使用它 CMake
比方说,位于共享库和头文件/path/to/my/lib,共享库libfib.so是在/path/to/my/lib/lib和标题fib.h是/path/to/my/lib/include和我自己的项目落户/path/to/my/project
这是我原来的CMakeLists.txt:
cmake_minimum_required(VERSION 3.2)
project(learn-lib)
set(CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}")
set(FIB_INCLUDE "${FIB_PREFIX}/include")
set(FIB_LIB "${FIB_PREFIX}/lib")
set(EXE mybin)
include_directories(${FIB_INCLUDE})
link_directories(${FIB_LIB})
add_executable(${EXE} main.cpp)
target_link_libraries(${EXE} fib)
install(TARGETS ${EXE} RUNTIME DESTINATION bin)
Run Code Online (Sandbox Code Playgroud)
我使用这个脚本来构建和安装我的项目:
mkdir -p build_dir
cd build_dir
cmake -DFIB_PREFIX=/path/to/my/lib \
-DCMAKE_INSTALL_PREFIX=/path/to/my/project \
..
make
make install
cd ..
Run Code Online (Sandbox Code Playgroud)
现在,在运行安装脚本之后,我得到了两个可执行文件,一个在build_dir安装位置,一个在安装位置path/to/my/project/bin,当运行程序时build_dir,一切都很好,但是当运行已安装的程序时,我得到:
./bin/mybin:加载共享库时出错:libfib.so:无法打开共享对象文件:没有这样的文件或目录
在google和stackoverflow上进行一些搜索后,我知道CMake在构建时似乎删除了与可执行文件绑定的运行时搜索路径.我现在知道两种方法来解决它:
libfib.so位于环境变量的库路径LD_LIBRARY_PATHset_target_properties(${EXE} PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE)我的CMakeLists.txt …我正在努力学习阴谋,并测试了几个我自己的小项目,现在我想要清理它们.
基本上,如果我没有工作sandbox,我的工作流程是:
cabal initsrc/Mylib.hs,然后编辑mylibname.cabal文件cabal buildcabal repl并测试我的代码cabal install现在,我看到了自己的项目:
~/.cabal/lib/x86-64-linux-ghc-7.10.1~/.ghc/package.conf.d我可以用import Mylib我的其他haskell源代码编写,所以我认为该软件包已成功安装.
然后我想卸载软件包,因为软件包本身只是无意义的实验代码.
我读过这篇文章,他说:
没有"cabal uninstall"命令.您只能使用ghc-pkg取消注册包:
Run Code Online (Sandbox Code Playgroud)ghc-pkg unregister
所以我跑了
ghc-pkg unregister mylibname
Run Code Online (Sandbox Code Playgroud)
现在,似乎该包未注册~/ghc/package.conf.d,但是,仍然有一个编译库 ~/.cabal/lib/x86-64-linux-ghc-7.10.1.
那么,我怎么能完全删除我的项目,我可以只是rm -rf库~/.cabal吗?
我正在使用vim-autoformat,它clang-format用作外部格式化程序.
似乎clang-format不会缩进C++ #pragma.例如:
#include <omp.h>
#include <cstdio>
int main()
{
#pragma omp parallel for
for (int i = 0; i < 10; ++i)
{
puts("demo");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我想把它格式化为:
#include <omp.h>
#include <cstdio>
int main()
{
#pragma omp parallel for
for (int i = 0; i < 10; ++i)
{
puts("demo");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我检查了clangformat,但没有找到我可以使用的选项.
在运行时cabal update,00-index.tar.gz从hackage下载需要很长时间,但是当我从chrome下载它时,它只是一个9M文件,下载很快完成.
那么,为什么cabal update这么慢,我可以通过手动下载文件来提高性能吗?
至于我正在使用的cabal版本,它是:
cabal-install版本1.22.6.0使用Cabal库的1.22.4.0版本
我试图通过在保存(:w)文件时记录时间戳来量化我的 vim 操作。
是否可以知道自上次保存以来文件是否真的被编辑过?
例如,我保存了文件:w,然后什么都不做,只是:w再次键入保存,是否可以判断该文件实际上没有被修改?
我实现了一个比较操作operator<的Eigen::VectorXd,有时候,我需要通过一个比较功能,以我的另外一个功能,我累了包裹的operator<到[](const VectorXd& v1, const VectorXd& v2)->bool{return v1 < v2},所以我认为std::less类是有用的,因为,我的理解,它可以生成lambda函数只要operator<定义.
但是,我发现这std::less<VectorXd>对我不起作用,例如,下面的代码工作正常:
#include "Eigen/Dense"
#include <iostream>
#include <functional>
using namespace std;
using namespace Eigen;
struct T
{
int x;
};
bool operator<(const T& t1, const T& t2)
{
return t1.x < t2.x;
}
bool operator<(const VectorXd& v1, const VectorXd& v2)
{
return (v1.array() <= v2.array()).all() and (v1 != v2);
}
int main()
{
T t1, t2;
t1.x = …Run Code Online (Sandbox Code Playgroud) 有很多关于最近邻搜索问题的工作,所以我想知道我是否想要进行固定半径范围搜索,我可以利用这些算法进行最近邻搜索吗?
也许我可以一遍又一遍地进行第k次最近邻搜索,直到找到超出半径范围的点,但我想这可能会造成很多浪费.
在同一时间,我创建了一个指针指向std::vector,然后我做了一些push_back,reserve,resize操作与向量,这样的操作之后,是安全的指针比较的是向量的地址,以检查是否指针指向该向量,因为可能会有一些内存重新分配.
例如
std::vector<int> vec;
vector<int>* pVec = &vec;
vec.reserve(10000);
assert(pVec == &vec);
vec = anotherVec;
assert(pVec == &vec);
Run Code Online (Sandbox Code Playgroud)
更重要的是,将指针与向量的第一个值进行比较是否安全?例如:
std::vector<int> vec(1,0);
int* p = &vec[0];
// some operation here
assert(p == &vec[0]);
Run Code Online (Sandbox Code Playgroud)
正如我自己测试的那样,第一种情况似乎是安全的,而第二种情况则不然,但我不能确定.