在Rust中,当我们想要一个包含引用的结构时,我们通常会定义它们的生命周期:
struct Foo<'a> {
x: &'a i32,
y: &'a i32,
}
Run Code Online (Sandbox Code Playgroud)
但是也可以为同一结构中的不同引用定义多个生命周期:
struct Foo<'a, 'b> {
x: &'a i32,
y: &'b i32,
}
Run Code Online (Sandbox Code Playgroud)
什么时候这样做有用?有人可以提供一些示例代码,这些代码在两个生命周期都'a
没有编译但是在生命周期时编译'a
并且'b
(反之亦然)?
我有一部分&[u8]
,我想将它附加到Vec<u8>
最小的复制.以下是我认识的两种方法:
let s = [0u8, 1u8, 2u8];
let mut v = Vec::new();
v.extend(s.iter().map(|&i| i));
v.extend(s.to_vec().into_iter()); // allocates an extra copy of the slice
Run Code Online (Sandbox Code Playgroud)
在Rust稳定中有更好的方法吗?(rustc 1.0.0-beta.2
)
我有一些代码在创建对象后添加到a std::vector
和a std::map
.
v.push_back(object); // std::vector
m[object->id] = object; // std::map
Run Code Online (Sandbox Code Playgroud)
我想让它有一个强大的异常保证.通常,为了使这些操作成为原子,我会为每个容器实现一个swap方法,并调用所有可能抛出容器临时副本的函数:
vector temp_v(v);
map temp_map(m);
temp_v.push_back(object);
temp_m[object->id] = object;
// The swap operations are no-throw
swap(temp_v, v)
swap(temp_m, m)
Run Code Online (Sandbox Code Playgroud)
但是,制作整个矢量和地图的临时副本似乎非常昂贵.有没有办法在没有昂贵的副本的情况下为这个功能实现强大的异常保证?
鉴于以下用法auto
:
std::vector<int> v;
for (auto i = 0; i < v.size(); ++i) {
...
}
Run Code Online (Sandbox Code Playgroud)
这将是理想的C++推断i
为std::vector<int>::size_type
,但如果只着眼于初始值设定i
,它会看到一个整数.i
在这种情况下推导出的类型是什么?这是适当的用法auto
吗?
以下C++无效,因为引用变量需要初始值设定项:
int& a; // illegal
if (isfive) {
a = 5;
} else {
a = 4;
}
Run Code Online (Sandbox Code Playgroud)
但是,MSVC似乎认为这没关系:
int& a = isfive ? 5 : 4;
Run Code Online (Sandbox Code Playgroud)
这意味着MSVC实际上将条件运算符视为单个表达式,而不是将其扩展为if-else语句.
使用条件运算符初始化引用始终是有效的C++吗?