C++ STL vs Rust 종합 비교 가이드

C++ STL vs Rust 종합 비교 – C++의 STL 기능과 Rust의 대응 기능을 타입, 상세 코드 샘플, 그리고 구현 방식 차이점으로 비교 정리한 문서입니다.

1. 컨테이너 (Containers)

데이터를 저장하는 구조체들입니다.

C++ STL 라이브러리 C++ 주요 타입 (샘플) Rust 대응 기능 / 타입 (샘플) 특징 및 차이점
<vector> std::vector<int> v = {1, 2};
v.push_back(3);
int x = v[0];
let mut v = vec![1, 2];
v.push(3);
let x = v[0];
두 언어 모두 가장 기본이 되는 동적 배열입니다. (Rust는 접근 시 경계 검사 수행)
<list> std::list<int> l;
l.push_back(1);
use std::collections::LinkedList;
let mut l = LinkedList::new();
l.push_back(1);
Rust에서는 소유권 규칙 때문에 사용이 까다로워 권장되지 않습니다.
<deque> std::deque<int> d;
d.push_front(1);
d.push_back(2);
use std::collections::VecDeque;
let mut d = VecDeque::new();
d.push_front(1);
d.push_back(2);
양방향에서 삽입/삭제가 가능한 큐입니다.
<map> std::map<string, int> m;
m["a"] = 1;
use std::collections::BTreeMap;
let mut m = BTreeMap::new();
m.insert("a".to_string(), 1);
둘 다 이진 트리 기반이며, 키(Key)가 정렬된 상태를 유지합니다.
<unordered_map> std::unordered_map<string, int> m;
m["a"] = 1;
use std::collections::HashMap;
let mut m = HashMap::new();
m.insert("a".to_string(), 1);
해시 테이블 기반입니다. Rust는 보안을 위해 기본 해시 알고리즘이 더 강력합니다.
<set> std::set<int> s;
s.insert(1);
use std::collections::BTreeSet;
let mut s = BTreeSet::new();
s.insert(1);
중복을 허용하지 않는 정렬된 집합입니다.
<unordered_set> std::unordered_set<int> s;
s.insert(1);
use std::collections::HashSet;
let mut s = HashSet::new();
s.insert(1);
중복을 허용하지 않는 해시 기반 집합입니다.

2. 알고리즘 및 유틸리티 (Algorithms & Utilities)

데이터를 처리하고 관리하는 도구들입니다.

C++ STL 라이브러리 C++ 기능 예시 (샘플) Rust 대응 기능 / 매크로 (샘플) 특징 및 차이점
<algorithm> std::sort(v.begin(), v.end());
auto it = std::find(v.begin(), v.end(), 5);
v.sort();
let it = v.iter().find(|&&x| x == 5);
C++은 함수 형태, Rust는 메서드 체이닝(v.sort()) 방식입니다.
<memory> std::unique_ptr<int> p =
std::make_unique<int>(10);
let p = Box::new(10); 힙 메모리에 단일 소유권을 가진 데이터를 저장합니다.
<memory> std::shared_ptr<int> p =
std::make_shared<int>(10);
use std::sync::Arc;
let p = Arc::new(10);
let p2 = Arc::clone(&p);
참조 횟수 기반 공유 포인터입니다. (Arc는 멀티스레드용)
<string> std::string s = "hello";
s += " world";
let mut s = String::from("hello");
s.push_str(" world");
Rust는 수정 가능한 String과 참조용 &str을 엄격히 구분합니다.
<utility> std::pair<int, string> p = {1, "a"};
int id = p.first;
let p = (1, "a");
let id = p.0;
Rust는 별도 타입 없이 소괄호로 즉석에서 튜플을 만듭니다.
<tuple> std::tuple<int, double, string> t =
{1, 2.5, "a"};
let t = (1, 2.5, "a");
let (x, y, z) = t;
Rust는 개수 제한 없는 튜플을 기본 언어 차원에서 지원합니다.
<chrono> auto d = std::chrono::seconds(1); use std::time::Duration;
let d = Duration::from_secs(1);
시간 간격을 나타냅니다.

3. 멀티스레딩 및 시스템 (Concurrency & System)

동시성 처리를 위한 기능들입니다.

C++ STL 라이브러리 C++ 주요 타입 (샘플) Rust 대응 기능 / 라이브러리 (샘플) 특징 및 차이점
<thread> std::thread t([] { ... });
t.join();
use std::thread;
let t = thread::spawn(|| { ... });
t.join().unwrap();
OS 스레드 생성 기능은 거의 동일합니다.
<mutex> std::mutex mtx;
std::lock_guard<std::mutex> g(mtx);
use std::sync::Mutex;
let m = Mutex::new(0);
let mut data = m.lock().unwrap();
Rust의 Mutex는 데이터를 내부에 감싸서 보호하는 형태라 훨씬 안전합니다.
<future> auto f = std::async([] { return 1; });
int res = f.get();
#[tokio::main] async fn main() {
let h = tokio::spawn(async { 1 });
let res = h.await.unwrap();
Rust는 언어 차원의 async와 Tokio 같은 외부 런타임을 조합해 씁니다.
<iostream> std::cout << "Value: " << x << std::endl; println!("Value: {}", x); Rust의 println!은 컴파일 시점에 타입을 검사하여 더 안전합니다.

💡 결정적인 차이점 요약

  1. 메서드 체이닝: C++ 알고리즘은 외부 함수 형태가 많지만, Rust는 반복자(Iterator)의 메서드를 줄줄이 엮어서 쓰는 방식(v.iter().map().filter().collect())을 선호합니다.
  2. 데이터 보호: C++의 std::mutex는 "이 뮤텍스를 잠그고 다른 데이터를 건드려야지"라고 개발자가 신경 써야 하지만, Rust의 Mutex<T>"데이터를 꺼내려면 뮤텍스를 반드시 잠궈야만 한다"는 구조로 되어 있어 실수를 원천 차단합니다.
  3. 에러 처리: C++은 예외(try-catch)를 쓰기도 하지만, Rust는 거의 모든 라이브러리가 Result<T, E>Option<T>를 반환하여 에러 처리를 강제합니다.