小编yni*_*ous的帖子

将str转换为&[u8]

这看起来微不足道,但我找不到办法.

例如,

fn f(s: &[u8]) {}

pub fn main() {
    let x = "a";
    f(x)
}
Run Code Online (Sandbox Code Playgroud)

无法编译:

error: mismatched types:
 expected `&[u8]`,
    found `&str`
(expected slice,
    found str) [E0308]
Run Code Online (Sandbox Code Playgroud)

但是,文件指出:

strs的实际表示具有与切片的直接映射:&str与&[u8]相同.

string slice rust

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

链接C++的迭代器

Python的itertools实现了一个迭代器,它基本上连接了许多不同的迭代器,以提供单个迭代器的所有东西.

C++中有类似的东西吗?快速浏览一下boost库并没有发现类似的东西,这对我来说非常令人惊讶.难以实现此功能吗?

c++ iterator

26
推荐指数
1
解决办法
9139
查看次数

减少stl向量的容量

有没有办法减少矢量的容量?

我的代码将值插入到向量中(事先不知道它们的数字),当这完成时,向量仅用于读取操作.

我想我可以创建一个新的向量,用大小做一个.reseve()并复制项目,但我真的不喜欢额外的复制操作.

PS:我不关心便携式解决方案,只要它适用于gcc.

c++ stl vector

26
推荐指数
4
解决办法
2万
查看次数

为什么带引用的类不符合standard_layout?

执行以下代码:

#include <iostream>
#include <type_traits>

struct s_ref {
    int &foo;
};

struct s_ptr {
    int *foo;
};

int main(int argc, char *argv[])
{
    std::cout << "s_ref is_standard_layout:" << std::is_standard_layout<struct s_ref>::value << std::endl;
    std::cout << "s_ptr is_standard_layout:" << std::is_standard_layout<struct s_ptr>::value << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

结果是:

s_ref is_standard_layout:0
s_ptr is_standard_layout:1
Run Code Online (Sandbox Code Playgroud)

基于标准布局的使用(即:"标准布局类型对于与其他编程语言编写的代码进行通信非常有用")这是有道理的,但我不确定哪个是违反的规则:

标准布局类是一个类(使用类,结构或联合定义):

  • 没有虚函数,也没有虚基类.

  • 对所有非静态数据成员具有相同的访问控制(private,protected,public).

  • 要么在大多数派生类中没有非静态数据成员,要么最多只有一个具有非静态数据成员的基类,或者没有带有非静态数据成员的基类.

  • 它的基类(如果有的话)本身也是一个标准布局类.

  • 并且,没有与其第一个非静态数据成员相同类型的基类.

编辑:引用来自:http://www.cplusplus.com/reference/type_traits/is_standard_layout/,但http://en.cppreference.com/w/cpp/concept/StandardLayoutType也类似.

c++

23
推荐指数
3
解决办法
657
查看次数

为什么移动构造函数需要其成员的默认构造函数?

我试图为没有复制构造函数的类实现移动构造函数.我收到一个错误,该类的成员的默认构造函数丢失.

这是一个简单的例子来说明这一点:

struct A {
public:
        A() = delete;
        A(A const&) = delete;
        A(A &&a) {}
};

struct B {
        A a;
        B() = delete;
        B(B const&) = delete;
        B(B &&b) {}
};
Run Code Online (Sandbox Code Playgroud)

试着编译这个,我得到:

move_without_default.cc: In constructor ‘B::B(B&&)’:
move_without_default.cc:15:11: error: use of deleted function ‘A::A()’
  B(B &&b) {}
           ^
move_without_default.cc:6:2: note: declared here
  A() = delete;
  ^
Run Code Online (Sandbox Code Playgroud)

为什么这是一个错误?有什么办法吗?

c++ default-constructor move-constructor

18
推荐指数
3
解决办法
1437
查看次数

具有返回迭代器的函数的trait

我正在尝试使用返回迭代器的函数构建一个特征.

我的简单示例如下所示:

pub trait TraitA {
    fn things(&self) -> Iterator<Item=&u8>;
}

fn foo<A: TraitA>(a: &A) {
    for x in a.things() { }
}
Run Code Online (Sandbox Code Playgroud)

哪个不起作用,因为在编译时不知道Iterator大小类型.

iterator traits rust

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

在 Cargo.toml 中定义 Cargo 配置文件的功能

我正在使用 Cargo Features ( https://doc.rust-lang.org/cargo/reference/features.html ) 来指定条件编译选项。有没有办法为给定的 Cargo 配置文件启用一组这些功能(https://doc.rust-lang.org/cargo/reference/profiles.html)?

例如,像这样的东西(这似乎不起作用):

[features]
foo = []

[profile.test]
features = ["foo"]
Run Code Online (Sandbox Code Playgroud)

这样我就不必写,cargo test --features "foo"而只是写cargo test

rust rust-cargo

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

对相关特质类型的约束

这是一个(有点人为的)例子来说明我想做什么

pub trait Node: Eq + Hash {
    type Edge: Edge;
    fn get_in_edges(&self)  -> Vec<&Self::Edge>;
    fn get_out_edges(&self) -> Vec<&Self::Edge>;
}

pub trait Edge {
    type Node: Node;
    fn get_src(&self) -> &Self::Node;
    fn get_dst(&self) -> &Self::Node;
}

pub trait Graph {
    type Node: Node;
    type Edge: Edge;
    fn get_nodes(&self) -> Vec<Self::Node>;
}

pub fn dfs<G: Graph>(root: &G::Node) {
    let mut stack = VecDeque::new();
    let mut visited = HashSet::new();

    stack.push_front(root);
    while let Some(n) = stack.pop_front() {
        if visited.contains(n) {
            continue
        }
        visited.insert(n); …
Run Code Online (Sandbox Code Playgroud)

rust associated-types

8
推荐指数
1
解决办法
2435
查看次数

vim 高亮:删除语法关键字

我使用的 vim 插件之一是:

syn keyword rustTodo contained TODO FIXME XXX NB NOTE

结果在NB评论中突出显示,这是我不喜欢的。有没有一种方法可以重新定义关键字或从中删除关键字?看着:help syn-keyword让我觉得这是不可能的。

vim

8
推荐指数
1
解决办法
1672
查看次数

期货::选择有什么区别!和 tokio::select?

我正在使用 Tokio,我想接收来自两个不同mpsc队列的请求。select!似乎是要走的路,但我不确定futures::select!和之间有什么区别tokio::select!。在哪种情况下,您应该使用一种而不是另一种?

asynchronous rust rust-tokio

6
推荐指数
1
解决办法
983
查看次数