Python으로 코딩을 배우고 대학원 와서야 C++을 만지고 어찌저찌 알고리즘 짜오면서 잘 먹고 살아오고 있었다. 그 동안 항상 묻지도 따지지도 않고 container가 필요하면 std::vector
를 사용했었다. 간간히 hash map같은거 구현한다고 unordered_map
같은건 몇번 썼었는데…
array
double xyz[3];
Eigen::Vector3f points[3]; // e.g., 3points of plane
vector
reserve()
해서 사용하는게 효율적이고 더 빠름PointVector
가 std::vector
로 구현되어있음)
PointVector pcl_to_pointvector(const pcl::PointCloud<pcl::PointXYZ> &pcl_in)
{
PointVector pointvector_out_;
if (pcl_in.size() > 0) pointvector_out_.reserve(pcl_in.size());
for (int i = 0; i < pcl_in.size(); ++i)
{
pointvector_out_.push_back(PointType(pcl_in.points[i].x, pcl_in.points[i].y, pcl_in.points[i].z));
}
return pointvector_out_;
}
pcl::PointCloud
가 std::vector
로 구현되어있음)
pcl::PointCloud<pcl::PointXYZ> get_pts_within_fov(const pcl::PointCloud<pcl::PointXYZ> &pcl_in, const vector<float> &cam_fov, const float &curr_yaw, const float &curr_pitch)
{
pcl::PointCloud<pcl::PointXYZ> pcl_out_;
if (pcl_in.size() > 0) pcl_out_.reserve(pcl_in.size());
for (int i = 0; i < pcl_in.size(); ++i)
{
pcl::PointXYZ pt_ = pcl_in.points[i];
if ( fabs(curr_yaw - pt_yaw(pt_)) < cam_fov[0] && fabs(curr_pitch - pt_pitch(pt_)) < cam_fov[1]) //angles diff
{
pcl_out_.push_back(pcl_in[i]);
}
}
return pcl_out_;
}
deque
(발음 디큐라고 안읽고 덱으로 읽음)
vector
에 비해서는 효율적vector
에 비해 효율적unordered_map
map
에 비해 느림map
에 비해 메모리를 많이 씀
map
unordered_map
에 비해 메모리를 적게 씀unordered_set
(set
과의 차이점은 map
과 unordered_map
과의 차이점과 동일)
raycasting
등으로 데이터 처리할때 유용함. 여러개의 ray에 대해서 일일이 순차적으로 voxel에 대한 정보를 update하지 않고, 일단 처리해야할 voxel의 index만 unordered_set
에 저장 후 한번에 처리하면 같은 index의 voxel에 대해 불필요하게 연산하는 것을 자연스럽게 막아줌void remove_points_raycast(const Vector3f &origin, const pcl::PointCloud<pcl::PointXYZ> &pts_in)
{
Vector3i origin_key_ = pt_to_key(origin);
unordered_set<Vector3i, hash_func> key_set_to_be_del_;
for (int i = 0; i < pts_in.size(); ++i)
{
Vector3i key_ = pt_to_key(pt_to_pt_type(pts_in.points[i]));
Raycast(origin, pt_to_pt_type(pts_in.points[i]), key_set_to_be_del_);
}
for (const auto& key: key_set_to_be_del_) //delete keys on the rays
{
m_hash_vox_points.erase(key);
}
return;
}
array
- size를 알고, 데이터가 적으면 자주 써야겠다.vector
+ reserve()
- size를 대충이라도 알면 써야겠다. 그렇지 않으면 deque
를 쓴다.
deque
- 중간에서 삽입, 삭제할일이 있거나 덩어리가 큰 struct
를 보관할때 써야겠다.
unordered_map
- 삽입 삭제가 굉장히 빈번한 경우 hashmap으로 써야겠다.unordered_set
- 중복되는 데이터 따로 신경쓰기 귀찮을때 vector
나 deque
대신 유용하게 쓸 수 있다.vector
vs list
vs deque
속도 비교 - 링크vector
vs deque
의 차이점 - 링크queue
와 stack
은 deque
을 사용해서 구현되어있다고 한다.
unordered_map
과 map
의 차이 - 링크, 링크2