在我的C++代码中,我不使用声明using namespace std;
或using namespace boost;
.这使我的代码更长,意味着更多的输入.我正在考虑开始使用"使用"声明,但我记得有些人反对这一点.建议的做法是什么?标准和助力是如此常见,那应该没有太大的伤害?
以下程序打击堆栈:
__find_first_occurrence :: (Eq b) => b -> [b] -> Int -> Int
__find_first_occurrence e [] i = -1
__find_first_occurrence e (x:xs) i
| e == x = i
| otherwise = __find_first_occurrence e xs (i + 1)
find_first_occurrence :: (Eq a) => a -> [a] -> Int
find_first_occurrence elem list =
__find_first_occurrence elem list 0
main = do
let n = 1000000
let idx = find_first_occurrence n [1..n]
putStrLn (show idx)
Run Code Online (Sandbox Code Playgroud)
失败了
堆栈空间溢出:当前大小为8388608字节.使用`+ RTS -Ksize -RTS'来增加它.
但是,据我所知,可能的递归调用__find_first_occurrence
是最后评估的事情 …
我有一个类Data
(现在)是不可复制的.std::sort
对std::vector<Data>
作品,因为我已经定义了移动构造函数和移动赋值的Data
.我是这样做的,因为类里面有很多数据,复制内容会太慢.但是,由于无关原因,我正在考虑将类复制构造函数Data(const Data& other)
和标准赋值运算符(from const Data&
)添加到类中.我怎样才能确保当我对矢量进行排序时Data
,std::sort
仍会使用move-constructor和move-assignment?
我对这段代码有问题:
#include <boost/multi_array.hpp>
#include <boost/array.hpp>
#include <vector>
#include <iostream>
template <typename Vec>
void foo(Vec& x, size_t N)
{
for (size_t i = 0; i < N; ++i) {
x[i] = i;
}
}
int main()
{
std::vector<double> v1(10);
foo(v1, 5);
std::cout << v1[4] << std::endl;
boost::multi_array<double, 2> m1;
boost::array<double, 2> shape;
shape[0] = 10;
shape[1] = 10;
m1.resize(shape);
foo(m1[0], 5);
std::cout << m1[0][4] << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
尝试用gcc编译它,我收到错误:
boost_multi_array.cpp: In function 'int main()':
boost_multi_array.cpp:26: error: invalid initialization of non-const …
Run Code Online (Sandbox Code Playgroud) 假设我用C++编写了一个DLL,并希望导出一个带有std :: vector参数的方法.我希望不同STL版本之间的任何二进制兼容性吗?
我想减少我正在处理的大型项目中.obj文件的大小(我知道链接器会删除重复的定义,但我想加快构建过程).其大小的原因之一是每个类使用std::vector<double>
或std::vector<std::string>
最终编译此类的代码并将其放在其.obj文件中.我试图显式实例化std::vector<double>
和使用extern template
声明,但它不起作用 - std::vector
在Visual Studio C++中,STL具有内联的所有方法.如果没有修改STL代码(我不会这样做),有没有办法强制编译器不内联实例化方法并使用外部实例化版本std::vector<double>
?
有没有办法在Haskell数组上进行静态检查?我们来看看这段代码:
import Data.Array
let a = listArray (0, 10) [-3.969683028665376e+01, 2.209460984245205e+02, -2.759285104469687e+02, 1.383577518672690e+02, -3.066479806614716e+01, 2.506628277459239e+00]
Run Code Online (Sandbox Code Playgroud)
(0, 10)
应该是(0, 5)
,但编译器接受代码.该错误仅在运行时检测到,尽管它可以在编译时检测到.
EPS10支持矢量图形中的透明度和图层.matplotlib可以生成EPS10文件吗?
如果我调用以下Haskell代码
find_first_occurrence :: (Eq a) => a -> [a] -> Int
find_first_occurrence elem list = (snd . head) [x | x <- zip list [0..], fst x == elem]
Run Code Online (Sandbox Code Playgroud)
与论点
'X' "abcdXkjdkljklfjdlfksjdljjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj"
Run Code Online (Sandbox Code Playgroud)
[('a',0), ('b',1), ]
将打造多少压缩列表?
更新:
我试着跑
find_first_occurrence 10 [1..]
Run Code Online (Sandbox Code Playgroud)
并且9
几乎立即返回,所以我猜它至少在简单的情况下使用延迟评估?当我跑步时,答案也会"立即"计算出来
let f n = 100 - n
find_first_occurrence 10 (map f [1..])
Run Code Online (Sandbox Code Playgroud) GHC编译顺利,但它在运行时失败了:
many_a x =
let
a = 2
in
let
a = 2*a
in
x*a
Run Code Online (Sandbox Code Playgroud)
直觉上,这不应该奏效.但是GHC接受了它.