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