日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++常用方法笔记资料

發布時間:2024/4/15 c/c++ 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++常用方法笔记资料 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

C++常用方法筆記資料


目錄

?

目錄

C++常用方法筆記資料

VS中常用的設置

C++函數注釋規范:

使用fprintf保存數據

C++和OpenCV的Debug文件

獲得路徑中的文件名和文件前綴和后綴名

統計數組中每個元素出現的次數

數組與vector互轉

openCV與vector互轉

vector自定義排序方式

vector自定義查找元素

C++獲取文件的時間等信息:#include

JNI C++接口的筆記

size_t 和 size_type的區別

shared_ptr和make_shared

Cmake構建項目:



VS中常用的設置

$(SolutionDir):表示當前解決方案的目錄,如設置頭文件路徑可這樣:$(SolutionDir)/extern/include;

$(ProjectDir):當前項目的目錄路徑

MFC應用程序顯示控制臺打印信息:生成事件->后期生成事件->命令行 中添加 :editbin /subsystem:console $(OutDir)\$(TargetName).exe,這樣cout或者printf就可以向控制臺輸出信息了


C++函數注釋規范:

/******************************************************** * @brief : 函數實現功能 * @param para1: 參數說明 * @param para2: 參數說明 * @return : 返回內容 ********************************************************/ int fun(int para1,float para2);

使用fprintf保存數據

int main() {char name[20] = "lucy";FILE *out;out = fopen("output.txt", "w");if (out != NULL)fprintf(out, "%s\n", name);return 0; }

C++和OpenCV的Debug文件

Debug.h:

#ifndef DETECT_DEBUG_H #define DETECT_DEBUG_H #include "opencv2/opencv.hpp" #include <chrono>#define millisecond 1000000using namespace std; //debug info ON-OFF #define __DEBUG__ON #ifdef __DEBUG__ON #define __DEBUG__WIN__ON //Window debug:print debug info #define __DEBUG__IMSHOW__ON //show debug images #define __DEBUG__IMWRITE__OFF //write debug images #define __DEBUG__TIME__ON //run times test on/off #define __DEBUG__ANDROID__OFF //android debug on/off//#include <assert.h> //#define DEBUG_ASSERT(...) assert( __VA_ARGS__) //#define DEBUG_CV_ASSERT(...) CV_Assert( __VA_ARGS__)#else #define __DEBUG__ON(format,...) #endif//print debug info #ifdef __DEBUG__WIN__ON //#define DEBUG_PRINT(...) printf("File: %s, Line: %05d: "format"", __FILE__,__LINE__, ##__VA_ARGS__) #define DEBUG_PRINT(...) printf( __VA_ARGS__);printf("\n") #else #define DEBUG_PRINT(format,...) #endif//show debug images #ifdef __DEBUG__IMSHOW__ON #define DEBUG_IMSHOW(...) showImages(__VA_ARGS__) #else #define DEBUG_IMSHOW(format,...) #endif//write debug images #ifdef __DEBUG__IMWRITE__ON #define DEBUG_IMWRITE(...) saveImage(__VA_ARGS__) #else #define DEBUG_IMWRITE(format,...) #endif//write debug images #ifdef __DEBUG__ANDROID__ON #include <android/log.h> // Define the LOGI and others for print debug infomation like the log.i in java #define LOG_TAG "SmartAlbum -- JNILOG" //#undef LOG #define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG, __VA_ARGS__) #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG, __VA_ARGS__) #define LOGW(...) __android_log_print(ANDROID_LOG_WARN,LOG_TAG, __VA_ARGS__) #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG, __VA_ARGS__) #define LOGF(...) __android_log_print(ANDROID_LOG_FATAL,LOG_TAG, __VA_ARGS__) #else #ifdef __DEBUG__WIN__ON #define LOGI(...) printf( __VA_ARGS__); printf("\n") #define LOGD(...) printf( __VA_ARGS__); printf("\n") #define LOGW(...) printf( __VA_ARGS__); printf("\n") #define LOGE(...) printf( __VA_ARGS__); printf("\n") #define LOGF(...) printf( __VA_ARGS__); printf("\n") #else #define LOGI(...) #define LOGD(...) #define LOGW(...) #define LOGE(...) #define LOGF(...) #endif #endif//run times test... #ifdef __DEBUG__TIME__ON #define LOG_TIME LOGE #define RUN_TIME(time_) (double)(time_).count()/millisecond //#define RUN_TIME(...) getTime_MS( __VA_ARGS__)//設置計算運行時間的宏定義 #define DEBUG_TIME(time_) auto time_ =std::chrono::high_resolution_clock::now() #define DEBUG_TIME_PRINT(time_) printf("run time: %s=%3.3f ms\n", #time_,(double)(time_).count()/millisecond) #else #define DEBUG_TIME(time_) #endiftemplate<typename TYPE> void PRINT_1D(string name,TYPE *p1, int len) {printf("%s", name.c_str());for (int i = 0; i < len; i++) {printf("%f,", p1[i]);}cout << endl; }void showImages(const char *imageName, cv::Mat image); void showImages(const char *imageName, cv::Mat img, cv::Rect face); void showImages(const char *imageName, cv::Mat img, cv::Rect face, std::vector<cv::Point> pts); void showImages(const char *imageName, cv::Mat img, std::vector<cv::Point> pts);void saveImage(const char *imageName, cv::Mat image); void saveImage(const char *imageName, cv::Mat image, std::vector<int> para); void saveImage(const char *imageName, cv::Mat image, cv::Rect face, std::vector<cv::Point> pts); void saveImage(const char *imageName, cv::Mat img, cv::Rect face);vector<string> getFilesList(string dir); void writeDatatxt(string path, string data, bool bCover=false);#ifdef linux #define _LINUX #define separator "/"#endif #ifdef _WIN32//__WINDOWS_ #define _WINDOWS #define separator "\\" #endif#endif

Debug.cpp:

#include "opencv2/opencv.hpp" using namespace std; #include "debug.h"//*************************************顯示圖片**************************************** #define RESIZE(img_show,col) cv::resize(img_show, img_show, cv::Size(col, img_show.rows*col / img_show.cols))void showImages(const char *imageName, cv::Mat img) {cv::Mat img_show = img.clone();if (img_show.channels() == 1)cvtColor(img_show, img_show, cv::COLOR_GRAY2BGR);//char str[200];char str1[200];strcpy(str1, imageName);//sprintf(str, ",Size:%dx%d", image.rows, image.cols);//strcat(str1, str);RESIZE(img_show, 400);cv::imshow(str1, img_show);cv::waitKey(100); }void showImages(const char *imageName, cv::Mat img, cv::Rect face, std::vector<cv::Point> pts) {cv::Mat img_show = img.clone();if (img_show.channels() == 1)cvtColor(img_show, img_show, cv::COLOR_GRAY2BGR);for (int i = 0; i < pts.size(); ++i) {//std::cout << "index: " << i << std::endl;cv::circle(img_show, pts.at(i), 2.f, cv::Scalar(0, 0, 255), -1, CV_AA);// char str[3];// itoa(i, str, 10);// //line(imgDrawFace, cv::Point(shape.part(i).x(), shape.part(i).y()), cv::Point(shape.part(i).x(), shape.part(i).y()), cv::Scalar(0, i * 3, 255), 2);// putText(img_show, str, pts.at(i), cv::FONT_HERSHEY_DUPLEX, 0.5, cv::Scalar(255, 0, 0));}cv::rectangle(img_show, face, { 255, 0, 0 }, 2);char str[200];char str1[200];strcpy(str1, imageName);//sprintf(str, ",Size:%dx%d", img.rows, img.cols);//strcat(str1, str);RESIZE(img_show, 400);cv::imshow(str1, img_show);cv::waitKey(100); }void showImages(const char *imageName, cv::Mat img, std::vector<cv::Point> pts) {cv::Mat img_show = img.clone();if (img_show.channels() == 1)cvtColor(img_show, img_show, cv::COLOR_GRAY2BGR);for (int i = 0; i < pts.size(); ++i) {//std::cout << "index: " << i << std::endl;cv::circle(img_show, pts.at(i), 2.f, cv::Scalar(0, 0, 255), -1, CV_AA);// char str[3];// itoa(i, str, 10);// //line(imgDrawFace, cv::Point(shape.part(i).x(), shape.part(i).y()), cv::Point(shape.part(i).x(), shape.part(i).y()), cv::Scalar(0, i * 3, 255), 2);// putText(img_show, str, pts.at(i), cv::FONT_HERSHEY_DUPLEX, 0.5, cv::Scalar(255, 0, 0));}char str[200];char str1[200];strcpy(str1, imageName);//sprintf(str, ",Size:%dx%d", img.rows, img.cols);//strcat(str1, str);RESIZE(img_show, 400);cv::imshow(str1, img_show);cv::waitKey(100); }void showImages(const char *imageName, cv::Mat img, cv::Rect face) {int thickness = img.cols*0.005;thickness = thickness > 1 ? thickness : 1;cv::Mat img_show = img.clone();if (img_show.channels() == 1)cvtColor(img_show, img_show, cv::COLOR_GRAY2BGR);cv::rectangle(img_show, face, { 255, 0, 0 }, thickness);char str[200];char str1[200];strcpy(str1, imageName);//sprintf(str, ",Size:%dx%d", img.rows, img.cols);//strcat(str1, str);RESIZE(img_show, 400);cv::imshow(str1, img_show);cv::waitKey(100); }//*************************************保存圖片****************************************void saveImage(const char *imageName, cv::Mat image) {cv::imwrite(imageName, image); }void saveImage(const char *imageName, cv::Mat image, std::vector<int> para) {cv::imwrite(imageName, image, para); }void saveImage(const char *imageName, cv::Mat image, cv::Rect face, std::vector<cv::Point> pts) {int thickness = image.cols*0.005;thickness = thickness > 1 ? thickness : 1;cv::Mat img = image.clone();for (int i = 0; i < pts.size(); ++i) {//std::cout << "index: " << i << std::endl;cv::circle(img, pts.at(i), 2.f, cv::Scalar(0, 0, 255), thickness, CV_AA);}cv::rectangle(img, face, { 255, 0, 0 }, thickness);cv::imwrite(imageName, img); }void saveImage(const char *imageName, cv::Mat img, cv::Rect face) {cv::Mat img_show = img.clone();if (img_show.channels() == 1)cvtColor(img_show, img_show, cv::COLOR_GRAY2BGR);cv::rectangle(img_show, face, { 255, 0, 0 }, 2);cv::imwrite(imageName, img_show); }//*************************************獲取文件列表**************************************** #ifdef _LINUX #include <memory.h> #include <dirent.h> vector<string> getFilesList(string dirpath) {vector<string> allPath;DIR *dir = opendir(dirpath.c_str());if (dir == NULL){cout << "opendir error" << endl;return allPath;}struct dirent *entry;while ((entry = readdir(dir)) != NULL){if (entry->d_type == DT_DIR) {//It's dir if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)continue;string dirNew = dirpath + separator + entry->d_name;vector<string> tempPath = getFilesList(dirNew);allPath.insert(allPath.end(), tempPath.begin(), tempPath.end());}else {//cout << "name = " << entry->d_name << ", len = " << entry->d_reclen << ", entry->d_type = " << (int)entry->d_type << endl; string name = entry->d_name;string imgdir = dirpath + separator + name;//sprintf("%s",imgdir.c_str()); allPath.push_back(imgdir);}}closedir(dir);//system("pause"); return allPath; } #endif #ifdef _WIN32//__WINDOWS_ #include <io.h> vector<string> getFilesList(string dir) {vector<string> allPath;// 在目錄后面加上"\\*.*"進行第一次搜索 string dir2 = dir + separator+"*.*";intptr_t handle;_finddata_t findData;handle = _findfirst(dir2.c_str(), &findData);if (handle == -1) {// 檢查是否成功 cout << "can not found the file ... " << endl;return allPath;}while (_findnext(handle, &findData) == 0){if (findData.attrib & _A_SUBDIR) 是否含有子目錄 {//若該子目錄為"."或"..",則進行下一次循環,否則輸出子目錄名,并進入下一次搜索 if (strcmp(findData.name, ".") == 0 || strcmp(findData.name, "..") == 0)continue;// 在目錄后面加上"\\"和搜索到的目錄名進行下一次搜索 string dirNew = dir + separator + findData.name;vector<string> tempPath = getFilesList(dirNew);allPath.insert(allPath.end(), tempPath.begin(), tempPath.end());}else //不是子目錄,即是文件,則輸出文件名和文件的大小 {string filePath = dir + separator + findData.name;allPath.push_back(filePath);}}_findclose(handle); // 關閉搜索句柄 return allPath; } #endif //***********************************將數據保存到txt文本中************************************* void writeDatatxt(string path, string data, bool bCover) {//fstream fout(path, ios::app);fstream fout;if (bCover){fout.open(path);//默認是:ios_base::in | ios_base::out}else{fout.open(path, ios::app);//所有寫入附加在文件末尾}fout << data << endl;fout.flush();fout.close(); }

獲得路徑中的文件名和文件前綴和后綴名

#define separator "\\"//分隔符 string image_path="D:\\dataset\\test.jpg" string output_dir="D:\\out-dataset" int index = image_path.find_last_of(separator);//獲得最后一個“\\”的位置 string full_name = image_path.substr(index + 1);//獲得文件名test.jpg int prex_index = full_name.find_last_of('.');//獲得最后一個“.”的位置 string prex_name = full_name.substr(0, prex_index);//獲得文件名前綴test string out_test_image = output_dir + separator + prex_name + "-lut.jpg";//結果為D:\\out-dataset\\test-lut.jpg

統計數組中每個元素出現的次數

?基本解決思路:
? ? ?首先我們聲明一個大小和inputArray一樣的數組countryArray,并將每個元素值初始化為-1,用來存儲每個元素的頻率。這需要一些技巧來達到和HashMap一樣的效果卻也不損失太多性能。
? ? ?if countArray[i] == -1,表示我們還沒有統計inputArray[i]這個元素的頻率; if countArray[i] == 0,表示我們已經統計過元素inputArray[i]的頻率了。
? ? ?用循環遍歷InputArray,from 0 到 N-1,統計每個元素的頻率。

? ? ?對于當前元素inputArray[i],if countArray[i] == -1,我們就保存這個元素的頻率到countArray[i];否則,不保存,因為之前已經統計過它了

#include <iostream> using namespace std;int main() {/*********************************************************************************/int inputArray[12] = {9,1,2,1,3,1,2,2,3,4,9,9};int countArray[12];int elementCount = 12;int i, j, count;/* Read array elements */for (i = 0; i < elementCount; i++) {countArray[i] = -1;}/** for any element inputArray[i], If countArray[i] = -1,* that means frequency is not counted for this number yet* and countArray[i] = 0 means frequency is already* counted for this number.*/for (i = 0; i < elementCount; i++) {count = 1;for (j = i + 1; j < elementCount; j++) {if (inputArray[i] == inputArray[j]) {countArray[j] = 0;//已經統計過置為0count++;}}if (countArray[i] != 0) {countArray[i] = count;//記錄首次出現的值在數組中出現的個數}}/* Print count of each element */for (i = 0; i<elementCount; i++) {if (countArray[i] != 0) {printf("Element %d : Count %d\n", inputArray[i], countArray[i]);}}system("pause");return 0; }

? ?若使用vector類型,可以改為更加實用的例子:比如下面的函數可以實現統計vector中每個元素出現的次數,且出現次數不少于minCount的集合

#include <vector> #include<algorithm> #include <iostream> using namespace std; struct Grade {int value;//值int count;//value值出現的次數 };/** @brief 函數實現統計數組/vector中每個元素出現的次數,且出現次數不少于minCount @param inputVector 輸入vector類型的數據 @param minCount 出現不少于minCount次 @return 返回vector<Grade>類型 */ vector<Grade> countElement(vector<int> inputVector,int minCount) {//int *status =new int[inputVector.size()];vector<int> status;//標記狀態:0表示未統計,>1表示已經統計了for (int i = 0; i < inputVector.size(); i++) {//status[i] = -1;status.push_back(0);}int v_size = inputVector.size();int value1 = 0, value2 = 0;int count = 0;//計數vector<Grade> container;//保存結果Grade perGrade;for (size_t i = 0; i < v_size; i++) {if (status[i] != 0)continue;count = 1;value1 = inputVector.at(i);status[i] = value1;for (size_t j = i + 1; j < v_size; j++) {if (status[j] != 0)continue;value2 = inputVector.at(j);if (value1 == value2){status[j] = value1;count++;}}if (count >= minCount){perGrade.value = value1;perGrade.count = count;container.push_back(perGrade);}}return container; }int main() {int inputArray[13] = {1,1,2,1,3,1,2,2,3,4,9,9,9};vector<int> inputVector(inputArray, inputArray + sizeof(inputArray) / sizeof(int));int minCount = 3;//統計vector中元素出現不少于minCount次數的元素vector<Grade> container=countElement(inputVector,minCount);system("pause");return 0; }

?


數組與vector互轉

? ??利用vector的構造函數,可以很方便的將數組轉為vector

int inputArray[12] = {9,1,2,1,3,1,2,2,3,4,9,9};vector<int> inputVector(inputArray, inputArray + sizeof(inputArray) / sizeof(float));

? ? 由于vector內部的數據是存放在連續的存儲空間,vector轉數組事實上只需要獲取vector中第一個數據的地址和數據的長度即可。如果僅僅是傳參,無需任何操作,直接傳地址即可,如果要進行數據復制,可以借用內存拷貝函數“memcpy”。例如:

int *buffer = new int[inputVector.size()];if (!inputVector.empty()){memcpy(buffer, &inputVector[0], inputVector.size() * sizeof(int));}

?參考資料:https://blog.csdn.net/Sagittarius_Warrior/article/details/54089242

openCV與vector互轉

? 請參考:https://blog.csdn.net/guyuealian/article/details/80253066

vector自定義排序方式

? ? ?下面的例子可實現vector中按照age的大小排序

#include <vector> #include<algorithm> #include <iostream> using namespace std;struct dataInfo {string name;int age; };//降序 bool descendingOrder(const dataInfo &a, const dataInfo &b) {return a.age > b.age; } //升序 bool ascendingOrder(const dataInfo &a, const dataInfo &b) {return a.age < b.age; }int main() {vector<dataInfo> v;dataInfo data;data.age = 10;data.name = "A";v.push_back(data);data.age = 40;data.name = "B";v.push_back(data);data.age = 20;data.name = "C";v.push_back(data);data.age = 30;data.name = "D";v.push_back(data);sort(v.begin(), v.end(), descendingOrder);system("pause");return 0; }

vector自定義查找元素

? ? 下面的方法可以實現vector查找指定元素是否存在

#include <vector> #include<algorithm> #include <iostream> #include <string> using namespace std;struct dataInfo {string name;int age;//dataInfo(string _name, int _age) : name(_name), age(_age) {} }; bool operator == (const dataInfo& a, const dataInfo& b) {return a.age == b.age;}int main() {vector<dataInfo> v;dataInfo data;data.age = 10;data.name = "A";v.push_back(data);data.age = 40;data.name = "B";v.push_back(data);data.age = 20;data.name = "C";v.push_back(data);data.age = 30;data.name = "D";v.push_back(data);data.age = 20;data.name = "E";v.push_back(data);//dataInfo t;t.age = 20;//查找年齡為20vector<dataInfo>::iterator ifind = find(v.begin(), v.end(), t);if (ifind != v.end()){cout << "index=" << ifind- v.begin()<< endl;cout << "data:name="<< ifind->name <<",age="<< ifind->age<<endl;}system("pause");return 0; }

? ? ?一種更通用的方法是:下面的程序實現:

? ? 【1】判斷vector的某一元素是否存在,并返回下標

? ? 【2】查找vector中最大,最小值的元素,并返回下標

#include <vector> #include<algorithm> #include <iostream> #include <string>using namespace std; struct dataInfo {string name;int age;//dataInfo(string _name, int _age) : name(_name), age(_age) {} };/*******判斷vector的某一元素是否存在,并返回下標 **********/ bool operator == (const dataInfo& a, const dataInfo& b) {return a.age == b.age; } template<typename _Tp> int find_element_in_vector(const vector<_Tp> v, const _Tp element) {vector<_Tp>::const_iterator it = find(v.begin(), v.end(), element);if (it != v.end()) {return it - v.begin();}else {return -1;} }/*******查找vector中最大,最小值的元素,并返回下標 **********/ bool cmp(const dataInfo& a, const dataInfo& b) {return a.age< b.age; }void main() {vector<dataInfo> v;dataInfo data;data.age = 10;data.name = "A";v.push_back(data);data.age = 40;data.name = "B";v.push_back(data);data.age = 30;data.name = "C";v.push_back(data);data.age = 30;data.name = "D";v.push_back(data);data.age = 20;data.name = "E";v.push_back(data);/**************************查找指定元素的位置*************************/dataInfo t;t.age = 20;//查找年齡為20 int index = find_element_in_vector(v, t);/**************************查找最大值*************************/dataInfo maxValue;///std::vector<int>::iterator maxIte = max_element(v.begin(), v.end());//若是基本數據類型std::vector<dataInfo>::iterator maxIte = max_element(v.begin(), v.end(),cmp);//結構體類型if (maxIte != v.end()){index = maxIte - v.begin();maxValue = *maxIte;}/**************************查找最小值*************************/dataInfo minValue;///std::vector<int>::iterator minIte = min_element(v.begin(), v.end());//若是基本數據類型std::vector<dataInfo>::iterator minIte = min_element(v.begin(), v.end(), cmp);//結構體類型if (minIte != v.end()){index = minIte - v.begin();minValue = *minIte;}}

C++獲取文件的時間等信息:#include <sys/stat.h>

string filePath = "D:\\SmartAlbum\\image1\\i.jpg";struct stat buf;struct tm* tim;int result = stat(filePath.c_str(), &buf);//顯示文件狀態信息if (result != 0)perror("顯示文件狀態信息出錯");else{cout << "文件創建時間:" << ctime(&buf.st_ctime);cout << "訪問日期:" << ctime(&buf.st_atime);//注意這里訪問時間為00:00:00為正常cout << "最后修改日期:" << ctime(&buf.st_mtime);cout << "時間值:" << buf.st_ctime << endl;tim = localtime(&buf.st_ctime);printf("創建時間%d:%d:%d:%d:%d:%d\n",tim->tm_year,tim->tm_mon,tim->tm_yday,tim->tm_hour,tim->tm_min,tim->tm_sec);}

JNI C++接口的筆記

Java接口定義:

public static native void transferImage_yuv420_888( byte[] Camera_y, int rowStride_y, int pixStride_y,byte[] Camera_u, int rowStride_u, int pixStride_u,byte[] Camera_v, int rowStride_v, int pixStride_v,int width, int height);

JNI對應的的C++接口:接口簡單實現Y數組加100,由于是通過指針直接對原數組進行操作,因此不需要返回結果

}extern "C" JNIEXPORT void JNICALL Java_com_example_lenovo_transfer_Transfer_transferImage_1yuv420_1888(JNIEnv *env, jclass type,jbyteArray Camera_y_, jint rowStride_y, jint pixStride_y,jbyteArray Camera_u_, jint rowStride_u, jint pixStride_u,jbyteArray Camera_v_, jint rowStride_v, jint pixStride_v,jint width, jint height) {jbyte *Camera_y = env->GetByteArrayElements(Camera_y_, NULL);jbyte *Camera_u = env->GetByteArrayElements(Camera_u_, NULL);jbyte *Camera_v = env->GetByteArrayElements(Camera_v_, NULL);// TODOunsigned char *y = (unsigned char *) Camera_y;unsigned char *u = (unsigned char *) Camera_u;unsigned char *v = (unsigned char *) Camera_v;for (size_t i=0; i < height; i++){for (size_t j=0; j < width; j++) {*y=*y+100;y++;}}env->ReleaseByteArrayElements(Camera_y_, Camera_y, 0);env->ReleaseByteArrayElements(Camera_u_, Camera_u, 0);env->ReleaseByteArrayElements(Camera_v_, Camera_v, 0); }

size_t 和 size_type的區別

?為了使自己的程序有很好的移植性,c++程序員應該盡量使用size_t和size_type而不是int, unsigned

  • size_t是全局定義的類型;size_type是STL類中定義的類型屬性,用以保存任意string和vector類對象的長度
  • ?string::size_type?制類型一般就是unsigned?int,?但是不同機器環境長度可能不同?win32?和win64上長度差別;size_type一般也是unsigned?int
  • 使用的時候可以參考:
?? string::size_type??a?=123;vector<int>size_type?b=234;size_t?b=456;

?

  • size_t?使用的時候頭文件需要?<cstddef>?;size_type?使用的時候需要<string>或者<vector>
? ? ?sizeof(string::size_type)?sizeof(vector<bool>::size_type)?sizeof(vector<char>::size_type)??sizeof(size_t)?

? ? ?上述長度均相等,長度為win32:4?win64:8

  • 二者聯系:在用下標訪問元素時,vector使用vector::size_type作為下標類型,而數組下標的正確類型則是size_t

shared_ptr和make_shared

std::shared_ptr<TNN_NS::TNN> net = std::make_shared<TNN_NS::TNN>();

Cmake構建項目:

項目結構:https://github.com/PanJinquan/opencv-learning-tutorials/tree/master/cmakeDemo

根目錄CmakeLists.txt:

cmake_minimum_required(VERSION 3.5) # 參考資料: # http://www.hahack.com/codes/cmake/ # https://blog.csdn.net/weicao1990/article/details/72844995project(cmakeDemo)# 指定頭文件目錄 include_directories(${PROJECT_SOURCE_DIR}/include)# 指定可執行文件的輸出目錄,輸出到bin下面 ? #set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)#指定庫文件輸出路徑 ? #set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)# 將myhello子工程加入到主工程,里面必須含有CMakeLists.txt文件 add_subdirectory(myhello)#指定可執行文件的輸出目錄,輸出到bin下面 ? set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)#指定庫文件輸出路徑 ? set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)set(LIB_MY my_lib)# 在指定目錄下查找庫,并保存在LIBPATH變量中: # find_library (<VAR> name1 [path1 path2 ...]) # find_library(LIB_MY my_lib ${PROJECT_SOURCE_DIR}/lib)# 構成可執行文件 add_executable(Demo main.cpp)# 鏈接的庫文件 # link_libraries( ${LIB_MY})# 添加鏈接庫:將子模myhello鏈接到Demo中 #target_link_libraries (Demo ${LIB_MY_LIB}) target_link_libraries (Demo ${LIB_MY})

myhello目錄的CMakeLists.txt文件

cmake_minimum_required(VERSION 3.5) # 常用的變量: # . 表示當前目錄 # ${PROJECT_SOURCE_DIR}:工程的根目錄 ?# 指定頭文件目錄,PROJECT_SOURCE_DIR為工程的根目錄 ? include_directories(${PROJECT_SOURCE_DIR}/include)#指定可執行文件的輸出目錄,輸出到bin下面 ? set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)#指定庫文件輸出路徑 ? set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)# 將指定的源文件生成鏈接文件myhello # add_library(myhello myhello.cpp) # 更加便捷的方法是使用aux_source_directory(<dir> <variable>) # 查找當前目錄下的所有源文件,并將名稱保存到 DIR_SRCS 變量中 aux_source_directory(${PROJECT_SOURCE_DIR}/myhello DIR_SRCS)add_library(my_lib ${DIR_SRCS}) #set_target_properties(my_lib PROPERTIES OUTPUT_NAME "my_lib")

?

總結

以上是生活随笔為你收集整理的C++常用方法笔记资料的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。