Open4

C++のアレをRustでやりたいとき

eduidleduidl

最初一つの記事にしようと思ったが面倒になった.コツコツ追記していく所存.

eduidleduidl

コンテナ系

C++ Rust
std::vector<T> std::vec::Vec<T>
std::array<T, N> [T; N]
std::deque<T> std::collections::VecDeque<T>
std::list<T> std::collections::LinkedList<T>
std::unordered_map<T> std::collections::HashMap<T>
std::map<T> std::collections::BTreeMap<T>
std::unordered_set<T> std::collections::HashSet<T>
std::set<T> std::collections::BTreeSet<T>
std::priority_queue<T> std::collections::BinaryHeap<T>

multi系(std::multiset)は軒並みRustの標準ライブラリにはない.std::stackとかstd::queueは何となく代替できるか.

eduidleduidl

operator overloading

#[derive(Debug, PartialOrd, PartialEq)]
struct Complex {
    re: f64,
    im: f64,
}

impl Complex {
    fn new(re: f64, im: f64) -> Self {
        Self { re, im }
    }
}

impl std::ops::Add for Complex {
    type Output = Self;
    
    fn add(self, other: Self) -> Self {
        Self {
            re: self.re + other.re,
            im: self.im + other.im,
        }
    }
}

fn main() {
    let c1 = Complex::new(1.0, 2.0);
    let c2 = Complex::new(3.0, -4.0);
    assert_eq!(Complex::new(4.0, -2.0), c1 + c2);
}
eduidleduidl

名前空間

modで代用.

namespace aaa {}
mod aaa {}

大きな違いとしては,modnamespaceと違って複数箇所に置けないというのはあるが,前方宣言とか必要ないRustではあまり問題にならない.

インライン名前空間

結構前に提案されてるけど言うほどいる?

inline namespace aaa {}
use aaa::*;
mod aaa {}

その他

  • 無名名前空間
    • Rustにはいらない
  • 入れ子名前空間
    • まあなくても