在Essentials of Modern C++ Style (video)中,Herb Sutter提倡:
import pandas as pd
import numpy as np
import scipy as sp
s = pd.Series([np.nan, np.nan, 1, np.nan, 3, np.nan, np.nan])
# interpolate using scipy
# ===========================================
s_no_nan = s.dropna()
func = sp.interpolate.interp1d(s_no_nan.index.values, s_no_nan.values, kind='linear', bounds_error=False)
s_interpolated = pd.Series(func(s.index), index=s.index)
Out[107]:
0 NaN
1 NaN
2 1
3 2
4 3
5 NaN
6 NaN
dtype: float64
# extrapolate using user-defined func
# ===========================================
def my_extrapolate_func(scipy_interpolate_func, new_x):
x1, x2 = scipy_interpolate_func.x[0], scipy_interpolate_func.x[-1]
y1, y2 = scipy_interpolate_func.y[0], scipy_interpolate_func.y[-1]
slope = (y2 - y1) / (x2 - x1)
return y1 + slope * (new_x - x1)
s_extrapolated = pd.Series(my_extrapolate_func(func, s.index.values), index=s.index)
Out[108]:
0 -1
1 0
2 1
3 2
4 3
5 4
6 5
dtype: float64
而不是
auto varname = Constructor{ ... };
我尝试过:
Constructor varname( ... );
但收到了auto log = fstream{"log.txt", fstream::out};
关于已删除功能的错误消息(无论是否使用大括号或括号)。
是我的错还是g ++?
g++4.8 -std=c++11
工作正常。
fstream log{"log.txt", fstream::out};
#include <fstream>
using namespace std;
int main(int argc, char **argv)
{
auto log = fstream{"log.txt", fstream::out};
//fstream log{"log.txt", fstream::out};
log << "hello world" << endl;
}
答案 0 :(得分:4)
auto var = Type{...};
语法要求Type
可移动构造,但gcc在GCC 5.1之前不实现可移动的fstream。您的代码compiles with GCC 5.1。
答案 1 :(得分:1)
如果我没有错,那么建议来自Herb Sutter。
显然,问题是由于您无法复制构造std::fstream
(std::fstream
的复制构造函数标记为delete
)。但是,直观地说,由于右手边有临时值,因此应该使用move-constructor而不是copy-constructor。
事实上,以下编译在clang(clang++ -std=c++11
,OS X Mavericks)上很好:
#include <iostream>
#include <fstream>
int main() {
auto log = std::fstream{"test.cpp", std::fstream::out};
}