我想使用python编写搜寻器。这意味着:我已经获得了某些网站主页的URL,并且我希望我的程序能够通过停留在网站中的链接来爬网所有网站。如何快速轻松地做到这一点?我已经尝试过BeautifulSoup,但是它确实消耗CPU且在我的PC上非常慢。
在C ++ 11中,可以编写带有捕获的lambda(这太棒了!)
auto myfunc = [&] (int i) {return i + j;}; // j being somewhere in the lambda's context
Run Code Online (Sandbox Code Playgroud)
太棒了!但是,如果可以从一个函数甚至从另一个lambda返回这样的lambda,那将是非常好的。这有可能吗?
这听起来像是一个微不足道的问题,但我无法轻易找到解决方案。
这是我的代码:
#include <iostream>
#include <fcntl.h>
#include <semaphore.h>
using namespace std;
int main()
{
sem_t * my_semaphore = sem_open("./my_semaphore", O_CREAT, 0755, 1);
cout<<my_semaphore<<endl;
}
Run Code Online (Sandbox Code Playgroud)
这将打印出 0:未创建信号量。我究竟做错了什么?我在 OSX 环境中测试了这段代码,它运行得很好。
我有一个变量(固定大小).我的磁盘上有一个二进制文件,保存该变量.我的C++程序需要:
但是,我的程序运行的系统可能会出现电源故障:在某些时候,我的系统可能会随机断开电源,因此会在没有任何通知的情况下突然关闭.
因此,我需要在磁盘上完成或不完成更新操作.我试着弄清楚如何做这样的事情,但是人们永远无法确定做这种事情的最正确和最标准的方法是什么.我需要解决方案是跨平台的.因此,例如,据我所知,涉及在临时文件上写入新值然后重命名它的技巧仅适用于重命名操作是原子的POSIX兼容系统.
有全球运作的解决方案吗?我对性能不感兴趣,因为该变量只需要偶尔更新一次.
考虑以下C++代码片段:
#include <iostream>
#include <openssl/aes.h>
#define AES_KEY_LENGTH 32
using namespace std;
int main()
{
AES_KEY encryption_key;
AES_KEY decryption_key;
unsigned char key[AES_KEY_LENGTH] = {'t', 'e', 's', 't', 't', 'e', 's', 't', 't', 'e', 's', 't', 't', 'e', 's', 't', 't', 'e', 's', 't', 't', 'e', 's', 't', 't', 'e', 's', 't', 't', 'e', 's', 't'};
unsigned char iv[AES_BLOCK_SIZE] = {'t', 'e', 's', 't', 't', 'e', 's', 't', 't', 'e', 's', 't', 't', 'e', 's', 't'};
unsigned char iv_enc[AES_BLOCK_SIZE];
unsigned char iv_dec[AES_BLOCK_SIZE]; …
Run Code Online (Sandbox Code Playgroud) 请考虑以下示例:
template <typename lambda> void call_me_back(const lambda & callback)
{
// Very complicated calculation to find the meaning of everything
callback(42);
}
int main()
{
call_me_back([](const int & value)
{
std :: cout << value << std :: endl;
});
}
Run Code Online (Sandbox Code Playgroud)
在这里,我提供call_me_back
了一个接受一个的lambda int
.经过一些长时间的计算后call_me_back
调用callback
,并callback
打印出来.像蛋糕一样容易.
现在,根据执行情况,call_me_back
需要callback
使用int
或使用其他类型调用.我们可以编辑前面的例子
template <typename lambda> void call_me_back(const lambda & callback)
{
// Very complicated calculation to find the meaning of everything
if(rand() …
Run Code Online (Sandbox Code Playgroud) 查看 clang-5.0发行说明,它说“ C++ 协程 TS已落地”,并建议查看此示例以开始使用。我显然可以在线运行该示例,因此我决定在我的 Ubuntu Server 16.04 Xenial 机器上尝试一下。
从干净的安装中,我刚刚尝试过
wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add -
sudo apt-add-repository "deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-5.0 main"
sudo apt-get update
sudo apt-get install -y clang-5.0 libc++-dev
Run Code Online (Sandbox Code Playgroud)
并直奔
clang++-5.0 -Wall -Wextra -std=gnu++2a "-fcoroutines-ts" "-stdlib=libc++" -o test.out test.cpp
Run Code Online (Sandbox Code Playgroud)
(是上述示例test.cpp
的复制和粘贴)
然而,我只是得到
coroutines.cpp:2:10: fatal error: 'experimental/coroutine' file not found
#include <experimental/coroutine>
Run Code Online (Sandbox Code Playgroud)
所以我可以想象我缺少一些东西,无论是安装还是在编译标志中。我尝试在网上查找,但找不到任何有用的东西。
我究竟做错了什么?
我知道我可以让函数只接受实现给定特征的类型。例如,我可以
fn f<T>()
where
T: MyTrait,
{
// Super useful stuff
}
Run Code Online (Sandbox Code Playgroud)
如果我想实现一个可以接受任何未实现给定特征的函数,该怎么办?例如,假设我有一些计算,要么:
我想做的是这样的:
fn preprocess<T>(computation: &mut T)
where
T: !Shortcut,
{
// Carry out the expensive precomputation.
}
Run Code Online (Sandbox Code Playgroud)
我试图弄清楚如何解决此问题,但似乎无法解决任何问题。
考虑以下trait
:
pub trait Representable {
const SIZE: usize;
fn get(&self) -> [u8; SIZE];
fn set(&mut self, value: [u8; SIZE]);
}
Run Code Online (Sandbox Code Playgroud)
我想为任何struct
可以表示为固定大小的字节数组的对象实现它。为此,我添加了trait
一个关联常量SIZE
,使得返回get
和接受的表示形式为set
字节SIZE
长。
但是,当我尝试编译时,我收到以下消息:
error[E0425]: cannot find value `SIZE` in this scope
--> src/bytewise/representable.rs:4:27
|
4 | fn get(&self) -> [u8; SIZE];
| ^^^^ not found in this scope
error[E0425]: cannot find value `SIZE` in this scope
--> src/bytewise/representable.rs:5:35
|
5 | fn set(&mut self, value: [u8; SIZE]); …
Run Code Online (Sandbox Code Playgroud) 在C++中,我正在使用一个宏,我需要定义两个变量,第一个变量应该与定义它的范围具有相同的公共/私有/受保护状态,而另一个变量应该是私有的.但是,如果我这样做:
#define my_macro(a, b) int a;\
private: int b;
Run Code Online (Sandbox Code Playgroud)
然后我永久改变了范围!这个不好.所以我想知道:有没有办法说:"只有这个变量/成员/方法/类是私有的"?
我天真地尝试做类似的事情
class my_class
{
public:
int i;
private int j;
};
Run Code Online (Sandbox Code Playgroud)
但没有运气.有什么方法可以得到我需要的东西吗?
编辑:我不确定定义宏的范围是公开的.正如我所说的那样," [...]第一个应该具有与定义它的范围相同的公共/私人/受保护状态 ",因此公共或私人或受保护,取决于范围.