据我所知,std::deque它的元素存储在大块的块中(尽管它依赖于实现,但这是我在大多数资源中所读到的),而std::vector在大多数情况下,它只使用一个内存块。
因此,std::vector在插入过程中遇到重新分配是很合理的。但是,我无法说明需要重新分配的任何情况,std::deque因为当电流耗尽时,它只是从新的内存块重新开始。
有人能提供我一些情况std::deque需要重新分配的情况吗?
我遇到了课堂模板std::unary_function和std::binary_function.
template <class Arg, class Result>
struct unary_function {
typedef Arg argument_type;
typedef Result result_type;
};
template <class Arg1, class Arg2, class Result>
struct binary_function {
typedef Arg1 first_argument_type;
typedef Arg2 second_argument_type;
typedef Result result_type;
};
Run Code Online (Sandbox Code Playgroud)
这两者都可以用作特定目的的基类.但仍然没有虚拟析构函数.我可以猜到的一个原因是这些并不意味着要进行多态处理.即
std::unary_function* ptr;
//intialize it
//do something
delete ptr;
Run Code Online (Sandbox Code Playgroud)
但如果是这样的话,不应该在析构函数中使用protected访问说明符,这样编译器就会破坏任何尝试.
我一直读到,在函数调用的情况下,临时变量只能与非常量引用参数绑定。
情况1:-
例如:-
class Simple{
public:
int i;
Simple(Simple &f)
{
i = f.i + 1;
}
Simple(int j)
{
i = j;
}
};
int main()
{
Simple f1 = Simple(2); // error no matching call fruit::fruit(fruit)...
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这会给我错误,因为我试图用非常量引用参数临时绑定。
案例2:-
try
{
throw e;
}
catch ( exception& e )
{
}
Run Code Online (Sandbox Code Playgroud)
我已经了解到,当我们抛出异常时,真正传递给 catch 的是抛出的原始异常的副本,即为抛出的对象创建一个临时对象,然后将其传递给 catch 子句。
catch 正在做的是通过非常量引用来捕获这个异常。这与我在案例 1 中展示的相反。
所以,我的问题是:-
1) 是否有允许临时绑定到非常量引用的特定场景。
2)如果有那么在允许这些例外时考虑了哪些因素。
我用来通过网络序列化的结构的定义
pub struct NetworkData {
id: String,
status: String,
details: <Data Structure>,
}
Run Code Online (Sandbox Code Playgroud)
现在有一个函数接受这个结构,将其序列化并通过网络发送。
fn send_data(data: NetworkData ...) -> ... {
let data = serde_json::to_string(&data).expect("serialize issue");
let mut request = Request::new(reqwest::Method::POST, url);
*request.body_mut() = Some(data.into());
self.inner
.execute(request)
...
}
Run Code Online (Sandbox Code Playgroud)
现在我想通过网络发送“x-www-form-urlencoded”数据,这应该更改此功能如下:-
fn send_data(data: NetworkData ...) -> ... {
// How should I change this?????
//let data = serde_json::to_string(&data).expect("serialize issue");
let mut request = Request::new(reqwest::Method::POST, url);
let content_type = HeaderValue::from_str(&format!("{}", "application/x-www-form-urlencoded",))
.expect("Header value creation bug");
request
.headers_mut()
.insert(header::CONTENT_TYPE, content_type);
*request.body_mut() = Some(data.into()); …Run Code Online (Sandbox Code Playgroud) 我正在尝试基于滚动策略构建一个记录器。以下是我能够实现的最接近的:
let logfile = FileAppender::builder()
.encoder(Box::new(PatternEncoder::new("{d} {l}::{m}{n}")))
.build("log/output.log")?;
let config = Config::builder()
.appender(Appender::builder().build("logfile", Box::new(logfile)))
.build(Root::builder()
.appender("logfile")
.build(LevelFilter::Debug))?;
log4rs::init_config(config)?;
Run Code Online (Sandbox Code Playgroud)
这帮助我记录所有级别的消息。但是,长时间记录到文件可能是一个危险的提议。因此,我正在寻找可以限制保留的日志数据量的东西。我遇到过RollingFileAppender,但找不到Policy.
请指导我完成这个。我主要是在寻找程序化配置。