C++
常用容器
string
- 定义
string str="ZhangWenYuan";
- 遍历
for(int i=0; i<str.size(); i++){
char c=str[i]; //注意str[i]是char类型
string s(1,c); //char-->string
}
- 位置索引
//增
str = str + s; //在str尾部追加char或string
str.push_back(s); //在str尾部追加char
str.insert(pos, s); //在str任意位置索引位置pos,插入string
//删
string sub_str = str.substr(pos, len); //取索引pos开始的len个字符
str.pop_back(); //删除str最后一个字符
str.erase(pos, len); //删除索引pos开始的len个字符
//改
//将索引pos开始的len个字符用str替换
str.replace(pos, len, str);
//int --> string
string str = to_string(32);
//string --> int
int num = stoi(str);
//string --> float
float num = stof(str);
//string --> double
double num = stod(str);
//查
//取str最后一个字符
char c = str.back();
//查找某个字符出现在str中的位置索引
pos=str.find_first_of('c'); //第一次出现'c'的位置索引
pos=str.find_last_of('c'); //最后一个出现'c'的位置索引
//查找str中是否有str2,并返回str2首字符在str中的最小的位置索引(即使str中有多个str2,只会返回第一个str2的位置)
size_t found = str.find(str2);
if (found!=std::string::npos)
cout<<found<<endl;
vector
- 定义
//一维初始化
vector<int> vec(n); //长度为n的vector,默认初始值为0;
vector<int> vec(n,3); //初始值为3;
vector<int> vec={1,2,3,4};
//二维初始化,如果没有经过初始化,是不能用vec[i].push_back(a);
vector<vector<int>> vec(row, vector<int>(col)); //row个数组的长度均为col
vector<vector<int>> vec={{1,2,3},{1,2},{1}}; //3个数组的长度不等,分别为3,2,1
- 位置索引
//增
vec.insert(vec.begin()+i,a); //在索引为i处插入a
vec.push_back(a); //在末尾添加a
vec.emplace_back(a); //在末尾添加a,效率比push_back要高
//删
vec.erase(vec.begin()+2); //删掉索引为2位置处的元素,返回指向vec.begin()+3位置的迭代器
vec.erase(vec.begin()+2,vec.begin()+5); //[2,5)
vec.pop_back(); //删除最后一个
vec.clear(); //清空并释放内存
//改
#include<functional>
//翻转
reverse(vec.begin(),vec.end());
//排序
sort(vec.begin(),vec.end()); //从小到大
sort(vec.begin(),vec.end(),greater<int>()); //从大到小
//求和
#include<numeric>
int sum = accumulate(vec.begin(), vec.end(), 0); //第三个参数是和的初始值
//排序并返回索引
#include<numeric>
#include<functional>
template <typename T>
vector<size_t> sort_index_e(vector<T> &v) {
vector<size_t> idx(v.size());
iota(idx.begin(), idx.end(), 0);//从0开始填充,即0,1,2,3…..
// https://zhidao.baidu.com/question/1771794183518976740.html
sort(idx.begin(), idx.end(),[&v](size_t i1, size_t i2) {return v[i1] > v[i2]; }); //从大到小是>,从小到大是<
return idx;
}
vector<size_t> idx;
idx = sort_index_e(vec);
//查
//取vec最后一个元素
auto num = vec.back();
//find(), 查找某个数字的位置索引(迭代器)
vector<int>::iterator it = find(vec.begin(), vec.end(), 6);
if (it != vec.end())
cout<<*it<<endl;
unordered_map
- 定义
unordered_map<string,int> umap;
unordered_map<string,int> umap{
{"apple", 3},
{"banana", 2},
{"grape", 6}
}
- 遍历
//输出 umap 存储键值对的数量
cout << "umap size = " << umap.size() << endl;
//只能使用迭代器输出 umap 容器存储的所有键值对, unordered_map<string,int>::iterator iter;
for (auto iter = umap.begin(); iter != umap.end(); ++iter) {
cout << iter->first << " " << iter->second << endl;
}
- 位置索引
增
umap["apple"]=3;
umap.emplace("banana", 2);
删
umap.erase("apple"); //删除指定Key的键对
改
umap["apple"]=4; //更改指定key值的value
//记录字符串每个字符最后出现的位置:
unordered_map<char,int> m;
string s;
for(int i=0; i<s.size(); i++){
m[s[i]]=i; //若s[i]不在map中,则为增emplace; 若在map中,则为改updata。
}
查
// count()
int num = dict.count("apple"); //如果存在,返回找到的以"apple"为key的键对数目,不存在则返回0;
// find()
auto iter = dict.find("apple");
if(iter!=dict.end()); // 存在(这个迭代器貌似没啥用)
cout << "there is a key named apple" << endl;
- map
unordered_map与map的区别:内部实现机理不同.
map用红黑树实现,因此内部的元素都是有序的,按照key从小到大
unordered_map用哈希表实现,则没这个性质,但查找速度更快(O(1))
stack
stack<int> stk; //定义
stk.push(); //压栈
stk.pop(); //删除栈顶元素
stk.top(); //得到栈顶元素
stk.size();
queue
queue<int> que; //定义
que.push(); //增加队尾压入元素
que.pop(); //删掉队头元素
que.front(); //得到队头元素
que.back(); //得到队尾元素
常用函数
memset()
将指定内存区域的内容设置为指定的值
void *memset(void *str, int c, size_t n)
例如:以下代码表示将字符数组 str
的所有字节初始化为 0
char str[50];
memset(str, 0, sizeof(str)); //初始化字符数组全为0
常用特殊指令
#if defined(标识符) #endif
#if defined(标识符)
用于检查指定的标识符是否已经被定义,如果已定义,则其后直到 #endif
之间的代码会被包含在编译过程中;如果未定义,则这部分代码会被忽略。
例如,我定义了一个宏 #define RV1106_1103
,那么在代码中 #if defined(RV1106_1103)
后面的代码会在编译时被处理。
typedef struct {
rknn_context rknn_ctx;
rknn_input_output_num io_num;
rknn_tensor_attr* input_attrs;
rknn_tensor_attr* output_attrs;
#if defined(RV1106_1103)
rknn_tensor_mem* input_mems[1];
rknn_tensor_mem* output_mems[3];
rknn_dma_buf img_dma_buf;
#endif
int model_channel;
int model_width;
int model_height;
bool is_quant;
} rknn_app_context_t;
这种预处理指令在条件编译中非常有用,可以根据不同的条件来决定是否包含或排除某些代码段,从而提高代码的灵活性和可移植性。
CMakeLists.txt
add_definitions(-DDEFINTION)
add_definitions()
函数用于向编译器添加预处理器定义,其中 -DDEFINITION
是要添加的定义。例如,add_definitions(-DRV1106_1103)
会定义一个名为 RV1106_1103
的宏。