133d722a9Sopenharmony_ci{{#title std::vector<T> — Rust ♡ C++}}
233d722a9Sopenharmony_ci# std::vector\<T\>
333d722a9Sopenharmony_ci
433d722a9Sopenharmony_ciThe Rust binding of std::vector\<T\> is called **[`CxxVector<T>`]**. See the
533d722a9Sopenharmony_cilink for documentation of the Rust API.
633d722a9Sopenharmony_ci
733d722a9Sopenharmony_ci[`CxxVector<T>`]: https://docs.rs/cxx/*/cxx/struct.CxxVector.html
833d722a9Sopenharmony_ci
933d722a9Sopenharmony_ci### Restrictions:
1033d722a9Sopenharmony_ci
1133d722a9Sopenharmony_ciRust code can never obtain a CxxVector by value. Instead in Rust code we will
1233d722a9Sopenharmony_cionly ever look at a vector behind a reference or smart pointer, as in
1333d722a9Sopenharmony_ci&CxxVector\<T\> or UniquePtr\<CxxVector\<T\>\>.
1433d722a9Sopenharmony_ci
1533d722a9Sopenharmony_ciCxxVector\<T\> does not support T being an opaque Rust type. You should use a
1633d722a9Sopenharmony_ciVec\<T\> (C++ rust::Vec\<T\>) instead for collections of opaque Rust types on
1733d722a9Sopenharmony_cithe language boundary.
1833d722a9Sopenharmony_ci
1933d722a9Sopenharmony_ci## Example
2033d722a9Sopenharmony_ci
2133d722a9Sopenharmony_ciThis program involves Rust code converting a `CxxVector<CxxString>` (i.e.
2233d722a9Sopenharmony_ci`std::vector<std::string>`) into a Rust `Vec<String>`.
2333d722a9Sopenharmony_ci
2433d722a9Sopenharmony_ci```rust,noplayground
2533d722a9Sopenharmony_ci// src/main.rs
2633d722a9Sopenharmony_ci
2733d722a9Sopenharmony_ci#![no_main] // main defined in C++ by main.cc
2833d722a9Sopenharmony_ci
2933d722a9Sopenharmony_ciuse cxx::{CxxString, CxxVector};
3033d722a9Sopenharmony_ci
3133d722a9Sopenharmony_ci#[cxx::bridge]
3233d722a9Sopenharmony_cimod ffi {
3333d722a9Sopenharmony_ci    extern "Rust" {
3433d722a9Sopenharmony_ci        fn f(vec: &CxxVector<CxxString>);
3533d722a9Sopenharmony_ci    }
3633d722a9Sopenharmony_ci}
3733d722a9Sopenharmony_ci
3833d722a9Sopenharmony_cifn f(vec: &CxxVector<CxxString>) {
3933d722a9Sopenharmony_ci    let vec: Vec<String> = vec
4033d722a9Sopenharmony_ci        .iter()
4133d722a9Sopenharmony_ci        .map(|s| s.to_string_lossy().into_owned())
4233d722a9Sopenharmony_ci        .collect();
4333d722a9Sopenharmony_ci    g(&vec);
4433d722a9Sopenharmony_ci}
4533d722a9Sopenharmony_ci
4633d722a9Sopenharmony_cifn g(vec: &[String]) {
4733d722a9Sopenharmony_ci    println!("{:?}", vec);
4833d722a9Sopenharmony_ci}
4933d722a9Sopenharmony_ci```
5033d722a9Sopenharmony_ci
5133d722a9Sopenharmony_ci```cpp
5233d722a9Sopenharmony_ci// src/main.cc
5333d722a9Sopenharmony_ci
5433d722a9Sopenharmony_ci#include "example/src/main.rs.h"
5533d722a9Sopenharmony_ci#include <string>
5633d722a9Sopenharmony_ci#include <vector>
5733d722a9Sopenharmony_ci
5833d722a9Sopenharmony_ciint main() {
5933d722a9Sopenharmony_ci  std::vector<std::string> vec{"fearless", "concurrency"};
6033d722a9Sopenharmony_ci  f(vec);
6133d722a9Sopenharmony_ci}
6233d722a9Sopenharmony_ci```
63