C++学习笔记

C++是一门十分优秀的编程语言,在复杂的算法开发编程中,因语言本身决定的高效率,常作为首选语言
本学习笔记是在看kallisto时写的,希望在一定的积累量后,能无错且迅速地看完一个软件的C++代码

?using namespace std;

如题,这样写是不好的,因为它增加了名称冲突的可能性,而且这一语句直接将所有需要std::的名称都导出到全局空间来;
优化一下,代码这样写:

1
2
3
int x;
std::cin >> x;
std::cout << x << "\n";

或者

1
2
3
4
5
using std::cin;
using std::cout;//using std::xxx when you need
int x;
cin >> x;
cout << x << "\n"

include“vector”

vector,向量或者容器

简单的向量操作

向量的基本初始化

1
std::vector<int> a;//vector<type> var_name;

在IDE中,直接a后面写.,可以看到不少向量的属性,以下,一些基本操作

1
2
3
4
5
6
7
8
a.begin();//起始位置
a.size();//元素个数
a.empty();//判断元素是否为空
a.clear();//清空元素
a = b;//复制
a.insert(i,content);//插入
a.erase(i);//删除
b.swap(a);//交换

以下,简单的测试函数:

1
2
3
4
5
6
7
8
9
10
11
12
//    test
std::vector<int> test(5,0);
std::vector<int> test2(test);
test[0] = 1;
test[1] = 2;
test[2] = 3;
std::cout << "size:"<<test.size()<<"\n";
std::cout << "begin: " << *test.begin() <<"\n";
std::cout << "is empty?"<< test2.empty() << "\n";
test.insert(test.begin(),test2.begin(),test2.begin()+2);
test.erase(test.begin());
test.emplace_back(1);

emplace_back

emplace_back相比push_back能减少内存拷贝和移动,能在容器插入元素时,性能得到进一步提升

反向迭代器

include“algotithm”

transform

对一个可以用迭代器迭代的变量类型,迭代每个元素,进行某个操作。可以用在字符串大小写转换,某个字符替换成其他字符上等等,语义与foreach相近,但更高效

1
2
3
4
5
std::string test_s = "abcd";
std::string test_t = " ";
std::transform(test_s.begin(),test_s.end(),test_t.begin(),toupper);
std::cout << test_s <<"\n";
std::cout << test_t << "\n";//ABCD,test_t.size must equal test_s.size

kalliso里有一段字符串的替换,验证了transform的强大作用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
std::string revcomp(const std::string s) {
std::string r(s);
std::transform(s.rbegin(), s.rend(), r.begin(), [](char c) {
switch(c) {
case 'A': return 'T';
case 'C': return 'G';
case 'G': return 'C';
case 'T': return 'A';
default: return 'N';
}
return 'N';
});
return r;
}

include“ofstream”

读写二进制

1
2
3
4
5
std::ofstream fout(example, std::ios::out | std::ios::binary);
// write
fout.write(content,sizeof(content);
// read
fout.read(content,sizeof(content));

菜鸟教程介绍的不错:文件与流

include”assert.h”

assert的作用是现计算表达式expression,如果其值为false(即为0),那么它先向std::cerr打印一条出错信息,然后通过调用abort来终止程序运行。

1
void assert( int expression );

“断言”每一次只检验一个条件,不然出现false,无法知道是哪一个条件产生的;主要用在调试程序上,调试结束后,在include前加上#define NDEBUG禁用

打赏还是得开着的,万一有人打赏呢?