【C++】系统基础知识

C++

常用容器

string

  1. 定义
string str="ZhangWenYuan";
  1. 遍历
for(int i=0; i<str.size(); i++){
	char c=str[i]; //注意str[i]是char类型
    string s(1,c); //char-->string
}
  1. 位置索引
//增
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

  1. 定义
//一维初始化
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   
  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

  1. 定义
unordered_map<string,int> umap;
unordered_map<string,int> umap{
    {"apple", 3},
    {"banana", 2},
    {"grape", 6}
}
  1. 遍历
//输出 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;
}
  1. 位置索引

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; 
  1. 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 的宏。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值