笔试常用命令以及注意事项

又是一篇抄袭Vincent的博客,主要整理了笔试中常见容器的用法

vector 容器类的使用

元素的访问

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 迭代器的方式(可以防止越界)
vector<int> ::iterator iter = record.begin(); // 定义迭代器
for (; iter != record.end(); iter++)
cout << *iter << " ";
cout << endl;
// 像数组一样的下标法访问,注意是否越界
vector<int> record({ 1, 2, 3, 4, 5 });
for (int i=0; i < record.size() ; i++)
cout << record[i] << " ";
cout << endl;
// 首尾元素
int first=record.front(); // 首
int last=record.back(); // 尾

赋值

  • 初始化vector元素
1
2
// 在record中放100个1
vector<int> record(100,1);
  • 输入单个元素
1
2
3
4
5
6
7
8
9
10
vector<int> record; // 没有定义record的大小
int input;cin >>input;
record.push_back(input); // 在record末尾追加input元素
// 注意:此时不能利用下标法进行赋值,即record[0]=input是错误的!
// 如果就是想用下标法赋值的话,必须指定vector的长度,即:
vector<int> record(1); // 没有定义record的大小
int input;cin >>input;
record[0]=input; // 在record末尾追加input元素
  • 将==输入的数字==传入一个已有的==vector==
1
2
3
4
// 输入a b c ,传入vector
int a,b,c;
cin>>a>>b>>c; // 输入a b c
vector<int> record({a,b,c});
  • 将一个==vector==中的一个==区间==赋值给另外一个==vector==
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 将已知的input的位置区间[i,j),即将从第i个位置到第j个位置之间的值传入到record
vector<int> input({1,2,3,4,5,6,7,8});
// 将区间[3,7)传入另一vector
vector<int> record(input.begin()+3-1,input.begin()+7-1);
// 也可以用其成员函数assign命令,将区间[i,j)内的数据赋值给另外一个vector
vector<int> record;
record.assign(input.begin(),input.end());
// 特殊地,将input全部元素赋值给record
vector<int> record(input.begin() , input.end());
// 或者使用vector的成员函数swap来交换两个vector的值
vector<int> record;
record.swap(input); // 将input赋值到record
  • 将一个==数组==赋值给另外一个==vector==
1
2
3
4
// 将数组arr 传入record
int arr[] = { 1, 2, 3, 4, 5 };
// 在vector变量的参数中,第一个是起始地址,第二个为终止地址
vector<int> record(arr, arr + sizeof(arr)/sizeof(arr[0]));

插入

  • insert成员函数
1
2
3
4
5
6
7
8
9
vector<int> record= { 1, 2, 3, 4, 5 };
// 在第2位(从第0位开始)插入100,也就是在2后面
record.insert(record.begin()+2,100); //输出:1 2 100 3 4 5
// record.insert(record+pos,c.begin(),c.end())在pos位插入c的全部元素
vector<int> record = { 1, 2, 3, 4, 5 };
vector<int> a({ 5, 2, 7, 8, 1, 0, 4 });
record.insert(record.begin() + 1, a.begin(), a.end());
// 输出1 5 2 7 8 1 0 4 2 3 4 5

排序

  • 对vector进行排序:==std::sort==的使用
1
2
3
4
5
// 将input复制到input_copy,然后对input_copy中的元素做排序处理
vector<int> input({ 2, 7, 4, 5, 1, 9, 3, 10, 6 });
vector<int> input_copy(input.begin() , input.end());
// 这里的排序是就地排序,会改变原来数组的位置关系
sort(input_copy.begin(), input_copy.end());

统计

  • 在vector中统计特定元素出现的次数:==std::count==的使用
1
2
3
4
5
6
// 统计record中出现7的次数
vector<int> input({ 2, 7, 1, 1, 1, 1, 4, 5, 1, 9, 7, 10, 6 });
vector<int> record(input.begin() , input.end());
// count是stl的标准函数,其参数是count(begin,end,value)
int times = count(record.begin(), record.end(), 7);
cout << times << endl; // 最后会输出 2

查找

  • 在vector中查找是否出现了某个元素:==std::find==的使用
1
2
3
4
5
6
7
// 判断record中是否出现8
vector<int> input({ 2, 7, 1, 1, 1, 1, 4, 5, 1, 9, 7, 10, 6 });
vector<int> record(input.begin() , input.end()); // 赋值给record
// 创建迭代器it,find是stl的标准函数,其参数是find(begin,end,value)
vector<int> ::iterator it = find(record.begin(), record.end(), 8);
if (it != tmp.end()) cout << "found it !" << endl;
else cout << "404 not found !" << endl;

map容器类的使用

map就是所谓的映射,表示了从key->value的映射关系,map中的元素是按照二叉搜索树存储,进行中序遍历会得到有序遍历。

注意:unordered_map和map类似,都是存储的key-value的值,可以通过key快速索引到value。不同的是unordered_map不会根据key的大小进行排序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
map<string, int>::iterator it; //unordered_map
map<string, int> record;
record.insert(make_pair("c", 6));
record.insert(make_pair("b", 66));
record.insert(make_pair("a", 666));
for (it = record.begin(); it != record.end(); ++it)
cout << "key: " << it->first << " value: " << it->second << endl;
// 此时输出:
// key: a value: 666
// key: b value: 66
// key: c value: 6
//将初始化时的map换成unordered_map,
// key: c value: 6
// key: b value: 66
// key: a value: 666

map的初始化

  • maprecord; 其中type1/2表示类型,
1
2
3
4
5
map<int, vector<int>> record;
vector<int > value = { 5, 2, 7, 8, 1, 0, 4 };
record.insert(pair<int, vector<int>>(1, value));
record.insert(pair<int, vector<int>>(2, {4,5}));
record.insert(pair<int, vector<int>>(3, {7,3,9,2}));

注意:上述初始化利用了pair来创建数据对, 在创建时需要指定类型。我们也可以用==make_pair==来简化这一步骤,make_pair():
无需写出型别, 就可以生成一个pair对象 。

1
2
3
4
map<int, vector<int>> record;
record.insert(make_pair(1, { 5, 2, 7, 8, 1, 0, 4 }));
record.insert(make_pair(2, {4,5}));
record.insert(make_pair(3, {7,3,9,2}));

map元素的访问

  • 访问普通数组的方式来访问map;不过此时的key值应为int型
1
2
3
4
5
6
7
8
cout << record.size() << endl; // 继续上述初始化的record
for (int i = 0; i < record.size(); i++)
{
vector<int> temp = record[i];
for (int j = 0; j < temp1.size(); j++)
cout << temp[j] << " ";
cout << endl;
}
  • 迭代器方式(任何)
1
2
3
4
5
6
7
8
9
map<int,int>::iterator it;
map<int, int> record;
record.insert(pair<int, int>(1, 100));
record.insert(pair<int, int>(2, 200));
record.insert(pair<int, itn>(3, 300));
for(it=record.begin();it!=record.end();++it)
cout<<"key: "<<it->first <<" value: "<<it->second<<endl;

查找:find()

对于容器们set,map以及相应的unordered_set或者unordered_map都有该成员函数。
例如对于一个unordered_map类型的变量record。

1
2
3
4
5
unordered_map<int,int> record;
if(record.find(key)!=record.end()) // 找到该建值
{
...
}

栈的使用

stack var; // 声明一个type_name类型的var

常用的命令包括

1
2
var.pop(); // 出栈
var.push(); // 入栈

位运算

n&1和n%2是一个意思

参考

vector容器类

在线IDE