如果集合中元素的值发生更改,则排序可能不再正确.如这个小程序所示:
#include <algorithm>
#include <iostream>
#include <set>
#include <string>
struct Comp
{
bool operator()(const std::string * lhs, const std::string * rhs)
{
return *lhs < *rhs;
}
};
int main()
{
typedef std::set<std::string*, Comp> MySet;
MySet mySet;
std::string * a = new std::string("a");
mySet.insert(a);
std::string * c = new std::string("c");
mySet.insert(c);
std::string * b = new std::string("b");
mySet.insert(b);
for (MySet::iterator it = mySet.begin(); it != mySet.end(); ++it)
{
std::cout << *(*it) << std::endl;
}
// Ouput has correct order:
// …Run Code Online (Sandbox Code Playgroud) 我正在使用Windows API和GDI +为Windows制作SVG渲染器.SVG允许在Path上设置'fill'和'stroke'样式属性.我在执行'fill'属性时遇到了一些困难.
以下路径代表螺旋:
<svg:path style="fill:yellow;stroke:blue;stroke-width:2"
d="M153 334
C153 334 151 334 151 334
C151 339 153 344 156 344
C164 344 171 339 171 334
C171 322 164 314 156 314
C142 314 131 322 131 334
C131 350 142 364 156 364
C175 364 191 350 191 334
C191 311 175 294 156 294
C131 294 111 311 111 334
C111 361 131 384 156 384
C186 384 211 361 211 334
C211 300 186 274 156 274" …Run Code Online (Sandbox Code Playgroud) 作为练习,我实现了数学幂函数.一旦使用recur:
(defn power [a n]
(let [multiply (fn [x factor i]
(if (zero? i)
x
(recur (* x factor) factor (dec i))))]
(multiply a a (dec n))))
user=> (time (dotimes [_ 10000] (power 2 512)))
"Elapsed time: 1839.406746 msecs"
Run Code Online (Sandbox Code Playgroud)
有一次使用lazy-seq:
(defn power [a n]
(letfn [(multiply [a factor]
(lazy-seq
(cons a (multiply (* a factor) factor))))]
(nth (multiply a a) (dec n))))
user=> (time (dotimes [_ 10000] (power 2 512)))
"Elapsed time: 2162.297827 msecs"
Run Code Online (Sandbox Code Playgroud)
您认为哪种实施方式更优越?我真的不知道..(我会使用复发,因为它更容易理解.)
我读到lazy-seq很快,因为它使用内部缓存.但我在样本中看不到缓存的任何机会.我忽略了什么吗?
更新
我发布了样本的时间.似乎复发在这里稍快一些.
定期递归也不会太糟糕:
(defn …Run Code Online (Sandbox Code Playgroud) 根据编程Clojure refs管理协调,同步更改共享状态和原子管理共享状态的不协调,同步更改.
如果我理解正确"协调"意味着多个更改被封装为一个原子操作.如果是这种情况,那么在我看来,协调只需要使用dosync调用.
例如:有什么区别:
(def i (atom 0))
(def j (atom 0))
(dosync
(swap! i inc)
(swap! j dec))
Run Code Online (Sandbox Code Playgroud)
和:
(def i (ref 0))
(def j (ref 0))
(dosync
(alter i inc)
(alter j dec))
Run Code Online (Sandbox Code Playgroud) 内联有两个方面:
inline如果编译器确定无法内联函数,则将忽略该关键字.由此我得出结论,我从不需要打扰内联.我只需打开发布版本的编译器优化.
或者是否有任何情况下首选手动内联?
我正在尝试将Linux C++项目移植到Mac OS X.在配置步骤中,执行以下命令:
$ glibtoolize --ltdl --force --copy
Run Code Online (Sandbox Code Playgroud)
哪个失败,输出如下:
glibtoolize: putting auxiliary files in `.'.
glibtoolize: copying file `./ltmain.sh'
glibtoolize: putting auxiliary files in `.'.
glibtoolize: copying file `libltdl/config/compile'
glibtoolize: copying file `libltdl/config/config.guess'
glibtoolize: copying file `libltdl/config/config.sub'
glibtoolize: copying file `libltdl/config/depcomp'
glibtoolize: copying file `libltdl/config/install-sh'
glibtoolize: copying file `libltdl/config/missing'
glibtoolize: copying file `libltdl/config/ltmain.sh'
glibtoolize: putting macros in `libltdl/m4'.
glibtoolize: copying file `libltdl/m4/argz.m4'
glibtoolize: copying file `libltdl/m4/libtool.m4'
glibtoolize: copying file `libltdl/m4/ltdl.m4'
glibtoolize: copying file `libltdl/m4/ltoptions.m4'
glibtoolize: copying file `libltdl/m4/ltsugar.m4'
glibtoolize: …Run Code Online (Sandbox Code Playgroud) 我想在计算机列表(Jenkins节点)上安装软件库(SWIG).我正在使用以下脚本来自动执行此操作:
NODES="10.8.255.70 10.8.255.85 10.8.255.88 10.8.255.86 10.8.255.65 10.8.255.64 10.8.255.97 10.8.255.69"
for node in $NODES; do
scp InstallSWIG.sh root@$node:/root/InstallSWIG.sh
ssh root@$node sh InstallSWIG.sh
done
Run Code Online (Sandbox Code Playgroud)
这种方式是自动化的,除了scp和ssh命令发生的密码请求.
有没有办法以编程方式输入密码?
安全不是问题.我正在寻找不涉及SSH密钥的解决方案.
我目前正在开发一个Java应用程序,我需要实现一个用于构建BPF表达式的系统.我还需要实现检测等效BPF表达式的机制.
构建表达式并不太难.我可以使用Interpreter设计模式构建语法树,并实现toString获取BPF语法.
但是,检测两个表达式是否相同则要困难得多.一个简单的例子如下:
A: src port 1024 and dst port 1024
B: dst port 1024 and src port 1024
Run Code Online (Sandbox Code Playgroud)
为了检测A和B是等价的,我可能需要在比较它们之前将每个表达式转换为"标准化"形式.对于上面的例子,这很容易,但是,当使用嵌套和操作的组合时AND,它变得越来越难.ORNOT
有谁知道我应该如何最好地解决这个问题?
以下代码失败push_back并成功emplace_back:
#include <vector>
volatile int x = 0;
int main()
{
std::vector<int> vec;
vec.emplace_back(x);
vec.push_back(x); // error: no matching function for call to 'std::vector<int>::push_back(volatile int&)'
}
Run Code Online (Sandbox Code Playgroud)
我理解push_backfailes因为它需要一个引用并试图volatile从该引用隐式地抛弃限定符.
但是,emplace_back 也需要引用(rvalue-references是引用).为什么区别对待?
当我在bash中运行以下命令时,它会等到程序完成后再刷新所有输出。如果我卸下管道,则它将立即打印每行。
{ for i in `seq 3` ; do echo $i ; sleep 1 ; done ; } \
| perl -p -e 's,(.*ERROR.*),\e[01;31m\1\e[00m,g' \
| perl -p -e 's,(.*WARNING.*),\e[01;33m\1\e[00m,g' \
| perl -p -e 's,(.*TCPEchoTest.*),\e[01;30m\1\e[00m,g' \
| perl -p -e 's,(.*enters.*),\e[00;33m\1\e[00m,g'
Run Code Online (Sandbox Code Playgroud)
如何使用管道,仍然要立即打印每行?