我需要将一个函数传递给一个操作符.任何具有正确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回归错误.我已经提交了错误报告: …
假设我们有一个包含n个向量的数组。我们要计算这些向量之间的最大欧几里得距离。最简单的方法是对数组进行迭代,然后为每个向量计算其与所有后续向量的距离,然后找到最大值。但是,该算法会增长(n-1)!关于数组的大小。
还有其他更有效的方法来解决此问题吗?
谢谢。
我正在编写可以在范围上进行地图/折叠操作的库.我需要与运营商合作.我对函数式编程不是很熟悉,我暂时选择*了地图和||折叠.所以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) 为什么这个含糊不清?
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中的合法.所以部分排序应该有效.
我写了一个简单的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 认为它是从管道读取的?
我正在为我的自定义双向迭代器实现递减运算符.递减迭代器指向Range的第一个元素是定义的行为吗?递减后是否有一些特殊值,如Range.end()?
我知道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++中定义多行宏时添加大量对齐的反斜杠,如下所示:
#define MACRO(X) \
line1 \
\
long long line3 \
line4
Run Code Online (Sandbox Code Playgroud)
如果我j在添加后在line1上执行\,则光标将跳转到第2行的第1列.
很久以前有一个名为MultiEdit的编辑器.它具有我在所有强大的VIM中找不到的功能.在MultiEdit中,我可以按下一些热键,它会显示类似于目录(也就是缩写模式,也就是大纲)的内容,我只能在当前文件中看到所有函数的第一行(让它成为C源代码).然后我可以将光标移动到我需要的功能,按下回车后,模式将切换到正常状态,我将处于我需要的功能中.对于那些喜欢将多个功能放在一个文件中的人来说非常有用.此功能使用起来非常简单:一个配置选项用于输入正则表达式以选择标题行,一个热键用于模式切换.
VIM有折叠.但这是不同的.折叠隐藏文件的一部分并显示折叠线指示器.在内容列表显示的折叠中指定要隐藏的内容要困难得多:您需要在标题行开始折叠并在下一个标题行之前结束.这比简单的正则表达式选择标题更复杂.
我非常想要这个功能,我甚至编写了VIM宏来模拟这个MultiEdit行为,尽管我不太了解VIM.我写的部分是因为学习一门新语言和编写一个宏比找出VIM折叠模块的复杂性更容易.不幸的是,在升级VIM之后,这个宏现在不起作用(无限循环?).我很久以前就已经写过了,关于VIM我所知道的一切都被遗忘了,我现在无法修复它.(编辑:我修复了我的脚本.感谢@romainl的链接).
我的问题是如何在VIM中显示这样的内容表?
有人可以向我解释为什么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)一直持续到构造函数退出."
我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.
我正在寻找适合大量字符串(> 10 ^ 9)的字符串容器.字符串具有可变长度.它必须快速插入和查找,并使用节俭的内存.当容器被填满时,字符串是无序的.平均字符串长度约为10个字节.查找精确的字符串值.可擦除性 - 可选.N事先不知道.适用于64位架构.用例 - 考虑AWK的关联数组.
map<string>每个字符串大约有20-40个开销,每个插入调用一个malloc(或两个).所以它并不快,也不节俭.
有人能指出我的C/C++库,数据结构还是纸张?
相对论 - 哈希表库的比较
编辑 我删除了"大数据",将N提升到更高的值,澄清了要求.