我有相同长度的列表a
, b
, ,... 。c
我想按照排序获得的顺序对所有这些进行排序a
,即我可以执行装饰-排序-取消装饰模式
a, b, c = map(list, zip(*sorted(zip(a, b, c))))
Run Code Online (Sandbox Code Playgroud)
或类似的东西。但是,我希望列表就地排序(我假设将sorted
传递给它的临时迭代器中的所有内容拉到临时列表中,然后zip
填充到三个输出列表中,因此输入中的每个数据都被不必要地复制两次)无需创建临时对象。所以我的意思不是:
a_sorted, b_sorted, c_sorted = map(list, zip(*sorted(zip(a, b, c))))
a[:] = a_sorted
b[:] = b_sorted
c[:] = c_sorted
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
我发现大多数 C++ stl 算法的传统语法很烦人;使用它们编写起来很长只是一个小问题,但它们总是需要对现有对象进行操作,这在很大程度上限制了它们的可组合性。
我很高兴看到 stl 中范围的出现;然而,从 C++20 开始,存在严重的缺点:标准库的不同实现对此的支持各不相同,并且 range-v3 中存在的许多内容并未进入 C++20,例如(对我来说)非常令人惊讶),将视图转换为向量(对我来说,如果我无法将计算结果存储在向量中,这会使这一切变得毫无用处)。
另一方面,使用 range-v3 对我来说似乎也不理想:它的文档很少(而且我不同意其中的所有内容都是不言自明的),而且更严重的是,C++20 的想法range 与 range-v3 所做的不同,所以我不能只是说,好吧,让我们坚持使用 range-v3;无论如何,这将在某个时候成为标准。
那么,我应该使用两者中的任何一个吗?或者这一切都不值得,并且通过依赖 std 范围或 range-v3,使我的代码太难以维护和移植?
Given a templated class, how do I define a (further templated) method out of line? The syntax
template<class T> class C {
public:
template<class S> void f();
};
template<class S, class T> void C<T>::f<S>(){}
Run Code Online (Sandbox Code Playgroud)
or any variant I have tried does not do the job:
error: use 'template' keyword to treat 'f' as a dependent template name
template<class S, class T> void C<T>::f<S>(){
^
template
error: nested name specifier 'C<T>::' for declaration does not refer into a class, class template …
Run Code Online (Sandbox Code Playgroud) 考虑
template <typename S, typename T, typename F>
vector<T> map(const vector<S> &ss, F f){
vector<T> ts;
ts.reserve(ss.size());
std::transform(ss.begin(), ss.end(), std::back_inserter(ts), f);
return ts;
}
int main(){
vector<int> is = {...};
vector<double> ts = map(is, [](int i){return 1.2*i;});
}
Run Code Online (Sandbox Code Playgroud)
因为编译器“无法推导出模板参数 T”。指定map
类型
template <typename S, typename T>
vector<T> map(const vector<S> &ss, std::function<T(S)> f)
Run Code Online (Sandbox Code Playgroud)
也不起作用,因为它与 lambda 不匹配。
正确的方法是什么?
在下面的代码中
template<class T> void f(T);
int main(){
f(3);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
像往常一样,模板参数int
for 会自动推导。
但在
template<class T> void f(T);
template<class T> void (*p)(T) = f<T>;
int main(){
p(3);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译器(clang++)坚持认为p(3)
需要模板参数。为什么?
此外,如果我将该行放在template<class T> void (*p)(T) = f<T>;
标头中以供多个文件包含,会导致问题吗?