如何優雅地從 C++ 向量中提取二維矩形區域
問題
template <class T> std::vector<T> copyRectFromVector(const std::vector<T>& vec, std::size_t startx, std::size_t starty, std::size_t endx, std::size_t endy, std::size_t fieldWidth, std::size_t fieldHeight) { using namespace std; vector<T> ret((endx-startx)*(endy-starty)+10); // 10: chickenfactor // checks if the given parameters make sense: if (vec.size() < fieldWidth*endy) { cerr << "Error: CopyRectFromVector: vector to small to contain rectangular region!" << std::endl; return ret; } // do the copying line by line: vector<T>::const_iterator vecIt = vec.begin(); vector<T>::forward_iterator retIt = ret.end(); vecIt += startx + (starty*fieldWidth); for(int i=starty; i < endy; ++i) { std::copy(vecIt, vecIt + endx - startx, retIt); } return ret;}
解決方案
vector<pixels> my_picture;point selTopLeft(10,10), selBotRight(40, 50);int picWidth(640), picHeight(480);rectangular_selection<vector<pixels> > selection1(my_picture.begin(), my_picture.end(), picWidth, picHeight, selTopLeft, selBotRight);// Now you can use stl algorithms on your rectangular rangevector<pixels> rect_copy = std::copy(selection1.begin(), selection1.end());// or maybe you don't want to copy, you want // to modify the selection in placestd::for_each (selection1.begin(), selection1.end(), invert_color);
#include <vector>#include <algorithm>#include <iostream>#include <iterator>template <typename I, typename O> void copyRectFromBiggerRect( I input, O output, std::size_t startx, std::size_t cols, std::size_t starty, std::size_t rows, std::size_t stride ) { std::advance(input, starty*stride + startx); while(rows--) { std::copy(input, input+cols, output); std::advance(input, stride); }}template<typename T> std::vector<T> copyRectFromVector ( const std::vector<T> &vec, std::size_t startx, std::size_t starty, std::size_t endx, std::size_t endy, std::size_t stride ) { // parameter-checking omitted: you could also check endx > startx etc. const std::size_t cols = endx - startx; const std::size_t rows = endy - starty; std::vector<T> ret; ret.reserve(rows*cols); std::back_insert_iterator<std::vector<T> > output(ret); typename std::vector<T>::const_iterator input = vec.begin(); copyRectFromBiggerRect(input,output,startx,cols,starty,rows,stride); return ret;}int main() { std::vector<int> v(20); for (int i = 0; i < 20; ++i) v[i] = i; std::vector<int> v2 = copyRectFromVector(v, 0, 0, 1, 2, 4); std::copy(v2.begin(), v2.end(), std::ostream_iterator<int>(std::cout, "\n"));}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70016198/viewspace-2886077/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- c++ 一維向量,和二維向量的基本使用C++
- 如何優雅地求和?
- 如何優雅地改善程式中for迴圈
- 在Java中如何優雅地判空Java
- 如何優雅絲滑地從Date過渡到LocalDateTimeLDA
- 如何安全、優雅的連回家庭區域網?
- 如何優雅地使用 macOSMac
- 如何優雅地構建易維護、可複用的 Android 業務流程(二)Android
- 如何在 Vue 中優雅地使用 CSS Modules?VueCSS
- 如何優雅地鏈式取值
- Git | 如何優♂雅地管理版本Git
- MongoDB中如何優雅地刪除大量資料MongoDB
- 前端如何優雅的製作帶LOGO的二維碼前端Go
- Kotlin如何優雅地使用Scope FunctionsKotlinFunction
- 如何優雅地向公司提加薪
- 如何優雅地取消Retrofit請求?
- Spring Boot中如何優雅地實現非同步呼叫?Spring Boot非同步
- 如何優雅地刪除 Linux 中的垃圾檔案Linux
- 如何優雅地恢復執行中的容器應用
- 如何優雅地從四個方面加深對深度學習的理解深度學習
- 如何優雅地記錄操作日誌
- 如何優雅地記錄操作日誌?
- 如何優雅地列印一個Java物件?Java物件
- 如何優雅地停止 Spring Boot 應用?Spring Boot
- 如何優雅地生成測試資料
- 如何優雅地定位外網問題?
- 如何優雅地處理前端異常?前端
- 如何更優雅地切換 Git 分支Git
- 如何優雅地構建易維護、可複用的 Android 業務流程Android
- 如何簡潔優雅地部署PostgreSQL和Pgweb?SQLWeb
- 如何優雅地生成仙人掌圖
- 面試時如何優雅地自我介紹?面試
- 如何優雅地動態插入資料到UITableViewUIView
- 如何優雅地實現分頁查詢
- 如何優雅地管理複雜前端程式碼前端
- 【Android】在Kotlin中更優雅地使用LiveDataAndroidKotlinLiveData
- 從Workload中優雅隔離Pod
- 在 JavaScript 中優雅的提取迴圈內的資料JavaScript