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