小编Leo*_*sky的帖子

如何将重载函数传递给运算符?

我需要将一个函数传递给一个操作符.任何具有正确arg类型的一元函数.返回类型可以是任何东西.因为这是库代码,所以我无法将其包装或转换f为特定的重载(在...之外operator*).函数将operator*1st arg作为自己的参数.下面的人工示例编译并返回正确的结果.但它有硬编码的int返回类型 - 使这个例子编译.

#include <tuple>
#include <iostream>
using namespace std;

template<typename T>
int operator* (T x,  int& (*f)(T&) ) {
    return (*f)(x);
};

int main() {
    tuple<int,int>  tpl(42,43);
    cout << tpl * get<0>;
}
Run Code Online (Sandbox Code Playgroud)

是否有可能operator*接受f任意返回类型?

更新 - GCC错误? 码:

#include <tuple>

template<typename T, typename U> 
U operator* (T x,  U& (*f)(T&) ) {  
    return (*f)(x);
}; 

int main() {
    std::tuple<int,int>  tpl(42,43);
    return   tpl * std::get<0,int,int>;
}  
Run Code Online (Sandbox Code Playgroud)

用gcc462和453正确编译和运行,但是gcc471和480拒绝.所以它可能是GCC回归错误.我已经提交了错误报告: …

c++ templates function-pointers operator-overloading c++11

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

计算数组中向量之间的最大距离

假设我们有一个包含n个向量的数组。我们要计算这些向量之间的最大欧几里得距离。最简单的方法是对数组进行迭代,然后为每个向量计算其与所有后续向量的距离,然后找到最大值。但是,该算法会增长(n-1)!关于数组的大小。

还有其他更有效的方法来解决此问题吗?

谢谢。

algorithm complexity-theory

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

map/fold运算符(用c ++开头)

我正在编写可以在范围上进行地图/折叠操作的.我需要与运营商合作.我对函数式编程不是很熟悉,我暂时选择*了地图和||折叠.所以cos(x)在间隔中找到(强力算法)最大值 8 < x < 9:

double maximum = ro::range(8, 9, 0.01) * std::cos  || std::max;
Run Code Online (Sandbox Code Playgroud)

在上面,ro::range可以用任何STL容器替换.

如果地图/折叠运算符有任何约定,我不想有所不同.我的问题是:是否有数学符号或者是否有任何语言使用运算符进行map/fold?

**编辑**

对于那些问过的人,下面是RO目前可以做什么的小型演示. scc是一个小实用程序,可以评估C++片段.

// Can print ranges, container, tuples, etc directly (vint is vector<int>) :
scc 'vint V{1,2,3};  V'
{1,2,3}

// Classic pipe. Alogorithms are from std::
scc 'vint{3,1,2,3} | sort | unique | reverse'
{3, 2, 1}

// Assign 42 to [2..5)
scc 'vint V=range(0,9);   range(V/2, V/5) = 42; …
Run Code Online (Sandbox Code Playgroud)

c++ functional-programming stl

6
推荐指数
2
解决办法
2365
查看次数

L-value-ref的部分排序

为什么这个含糊不清?

template<class T> void g(T)  {}   // 1
template<class T> void g(T&) {}   // 2

int main() {
    int  q;
    g(q);
}
Run Code Online (Sandbox Code Playgroud)

我知道这是部分订购的背景.而我的,可能是错误的想法是:任何来自#2的T&#都可以放在#1中,但#1中的任何T都不是#2中的合法.所以部分排序应该有效.

c++ templates overriding partial-ordering

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

Vim:警告:输入不是来自终端

我写了一个简单的jsonview脚本来查看json文件:

#!/bin/bash
tmp_file=/tmp/jsonview.json
cat "${@}" | python -m json.tool > $tmp_file
[[ -f $tmp_file ]]  &&  vim $tmp_file
Run Code Online (Sandbox Code Playgroud)

我没有使用,less因为我需要语法高亮。cat 的无用使用cat ${@} | ...是使脚本可以用作过滤器:

jsonview t.json
Run Code Online (Sandbox Code Playgroud)

和:

cat t.json | jsonview
Run Code Online (Sandbox Code Playgroud)

如果jsonview在第二个管道案例中使用 - 尽管 vim 不是在管道上而是在具体文件上调用的,但我在主题中收到了该警告。我可以查看 json 文件,但是退出后,它搞乱了终端。为什么是这个警告?为什么 vim 认为它是从管道读取的?

vim bash

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

--begin(container) - 被定义为行为?

我正在为我的自定义双向迭代器实现递减运算符.递减迭代器指向Range的第一个元素是定义的行为吗?递减后是否有一些特殊值,如Range.end()?

c++ iterator stl

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

如何获取指向std :: get <0,tuple <int,int >>)的指针?

我知道std :: get超载了.我知道要提取一个重载我需要转换为特定的签名.假设我需要一个指向std :: get的指针,它将非const ref从std :: tuple&返回到第一个元素.以下是我的许多尝试之一(不编译):

auto f = static_cast<
    int& (*)(std::tuple<int,int>&) noexcept
>(
    &std::get<(size_t)0u, std::tuple<int,int>>
);
Run Code Online (Sandbox Code Playgroud)

我该如何指定这个static_cast?

c++ tuples function-pointers c++11

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

如何在VIM中更高/更低并保持在同一列?

如何降低(或更高)一行并保持在同一列?

我需要它例如在C++中定义多行宏时添加大量对齐的反斜杠,如下所示:

#define MACRO(X)        \
     line1              \
                        \
     long long line3    \
     line4
Run Code Online (Sandbox Code Playgroud)

如果我j在添加后在line1上执行\,则光标将跳转到第2行的第1列.

vim

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

具有VIM折叠的目录

很久以前有一个名为MultiEdit的编辑器.它具有我在所有强大的VIM中找不到的功能.在MultiEdit中,我可以按下一些热键,它会显示类似于目录(也就是缩写模式,也就是大纲)的内容,我只能在当前文件中看到所有函数的第一行(让它成为C源代码).然后我可以将光标移动到我需要的功能,按下回车后,模式将切换到正常状态,我将处于我需要的功能中.对于那些喜欢将多个功能放在一个文件中的人来说非常有用.此功能使用起来非常简单:一个配置选项用于输入正则表达式以选择标题行,一个热键用于模式切换.

VIM有折叠.但这是不同的.折叠隐藏文件的一部分并显示折叠线指示器.在内容列表显示的折叠中指定要隐藏的内容要困难得多:您需要在标题行开始折叠并在下一个标题行之前结束.这比简单的正则表达式选择标题更复杂.

我非常想要这个功能,我甚至编写了VIM宏来模拟这个MultiEdit行为,尽管我不太了解VIM.我写的部分是因为学习一门新语言和编写一个宏比找出VIM折叠模块的复杂性更容易.不幸的是,在升级VIM之后,这个宏现在不起作用(无限循环?).我很久以前就已经写过了,关于VIM我所知道的一切都被遗忘了,我现在无法修复它.(编辑:我修复了我的脚本.感谢@romainl的链接).

我的问题是如何在VIM中显示这样的内容表?

vim folding

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

R值和L值的输出不同.为什么?

有人可以向我解释为什么R值的输出与L值不同?

#include <iostream>
#include <vector>
using namespace std;

template<typename Ct>
struct  ct_wrapper {
    Ct&& ct; // R or L ref
    explicit ct_wrapper(Ct&& ct) 
      : ct(std::forward<Ct>(ct)) { std::cout <<  this->ct[1];};
};

int main() {

    // L-val
    vector<int> v{1,2,3};
    ct_wrapper<vector<int>&> lv(v);
    cout << endl << lv.ct[0] << lv.ct[1] << lv.ct[2] << endl;

    // R-val
    ct_wrapper<vector<int>&&> rv(vector<int>{1,2,3});
    cout << endl << rv.ct[0] << rv.ct[1] << rv.ct[2] << endl;
}
Run Code Online (Sandbox Code Playgroud)

输出(gcc48和clang32相同):

2
123
2
003
Run Code Online (Sandbox Code Playgroud)

回答

在与Johannes Schaub的聊天中,它被埋没了,所以我把它放在这里.

当临时向量初始化r-value-ref成员变量时rv.ct,临时生命周期不会扩展,因为有一个特殊的例外:[class.temporary] p5:"临时绑定到构造函数的ctor-initializer中的引用成员(12.6.2)一直持续到构造函数退出."

c++ rvalue-reference perfect-forwarding c++11

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

T &&在模板化的功能和类中

T&&在课堂上偶然发现了它,功能意味着不同的东西.
功能:

template<class T> void f(T&& t){};   // t is R or L-value
...
int i=0; 
f(i);   // t in f is lvalue
f(42);  // t in f is rvalue  
Run Code Online (Sandbox Code Playgroud)

在班上:

template<class T> 
struct S { 
       S(T&& t){}  // t is only R-value? 
};
...
int i;
S<int> ss(i);   // compile error - cannot bind lvalue to ‘int&&’
Run Code Online (Sandbox Code Playgroud)

这是否意味着如果我们T&& t在课堂上,t那么只有rvalue?
有人可以指出我可以获得更多相关信息吗?
这是否意味着我需要为L和R值写两个方法重载?

答案
正如Alf的例子所示,t在函数和类中可以是Lvalue或Rvalue.

c++ rvalue-reference c++11 pass-by-rvalue-reference

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

大N的字符串容器

我正在寻找适合大量字符串(> 10 ^ 9)的字符串容器.字符串具有可变长度.它必须快速插入和查找,并使用节俭的内存.当容器被填满时,字符串是无序的.平均字符串长度约为10个字节.查找精确的字符串值.可擦除性 - 可选.N事先不知道.适用于64位架构.用例 - 考虑AWK的关联数组.

map<string>每个字符串大约有20-40个开销,每个插入调用一个malloc(或两个).所以它并不快,也不节俭.

有人能指出我的C/C++库,数据结构还是纸张?

相对论 - 哈希表库的比较

编辑 我删除了"大数据",将N提升到更高的值,澄清了要求.

c c++ algorithm data-mining data-structures

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