小编Kai*_*Kai的帖子

何时在结构中定义多个生命周期是有用的?

在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(反之亦然)?

lifetime rust

30
推荐指数
3
解决办法
1759
查看次数

将切片附加到矢量的惯用方法是什么?

我有一部分&[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)

vector rust

28
推荐指数
2
解决办法
1万
查看次数

添加到多个std容器时C++中的异常安全性

我有一些代码在创建对象后添加到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)

但是,制作整个矢量和地图的临时副本似乎非常昂贵.有没有办法在没有昂贵的副本的情况下为这个功能实现强大的异常保证?

c++ exception

12
推荐指数
1
解决办法
640
查看次数

C++ 11 auto和size_type

鉴于以下用法auto:

std::vector<int> v;
for (auto i = 0; i < v.size(); ++i) {
   ...
}
Run Code Online (Sandbox Code Playgroud)

这将是理想的C++推断istd::vector<int>::size_type,但如果只着眼于初始值设定i,它会看到一个整数.i在这种情况下推导出的类型是什么?这是适当的用法auto吗?

c++ auto c++11

8
推荐指数
3
解决办法
2084
查看次数

使用条件运算符初始化引用变量

以下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++吗?

c++ reference ternary-operator

7
推荐指数
3
解决办法
6184
查看次数

标签 统计

c++ ×3

rust ×2

auto ×1

c++11 ×1

exception ×1

lifetime ×1

reference ×1

ternary-operator ×1

vector ×1