小编Bub*_*aya的帖子

将多个列表一起排序

我有相同长度的列表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)

我怎样才能做到这一点?

python sorting

11
推荐指数
1
解决办法
1939
查看次数

在 C++ 中使用范围是否可取?

我发现大多数 C++ stl 算法的传统语法很烦人;使用它们编写起来很长只是一个小问题,但它们总是需要对现有对象进行操作,这在很大程度上限制了它们的可组合性。

我很高兴看到 stl 中范围的出现;然而,从 C++20 开始,存在严重的缺点:标准库的不同实现对此的支持各不相同,并且 range-v3 中存在的许多内容并未进入 C++20,例如(对我来说)非常令人惊讶),将视图转换为向量(对我来说,如果我无法将计算结果存储在向量中,这会使这一切变得毫无用处)。

另一方面,使用 range-v3 对我来说似乎也不理想:它的文档很少(而且我不同意其中的所有内容都是不言自明的),而且更严重的是,C++20 的想法range 与 range-v3 所做的不同,所以我不能只是说,好吧,让我们坚持使用 range-v3;无论如何,这将在某个时候成为标准。

那么,我应该使用两者中的任何一个吗?或者这一切都不值得,并且通过依赖 std 范围或 range-v3,使我的代码太难以维护和移植?

c++ range-v3 c++20 std-ranges

6
推荐指数
1
解决办法
3901
查看次数

Defining method with additional template parameters out of line

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)

c++ templates

2
推荐指数
1
解决办法
106
查看次数

在 cpp 中构建一个类似“map”的通用函数

考虑

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 不匹配。

正确的方法是什么?

c++ templates

1
推荐指数
1
解决办法
79
查看次数

函数指针的自动模板推导

在下面的代码中

template<class T> void f(T);
int main(){
    f(3);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

像往常一样,模板参数intfor 会自动推导。

但在

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>;标头中以供多个文件包含,会导致问题吗?

c++ templates function-pointers

1
推荐指数
1
解决办法
153
查看次数