C/C++ 刷题小知识点
原创
©著作权归作者所有:来自51CTO博客作者DonaldY的原创作品,请联系作者获取转载授权,否则将追究法律责任
C/C++
(1)字符串操作
1)stringstream
类别:输入输出操作
用途:①二次输出(类似缓存) ②数据转换
①
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
int main(void){
string s, input;
while(getline(cin, s)){ //getline 将一行内容给s,s的长度自动适配
cout << "S : " << s << endl;
stringstream str(s);
while(str>>input)
cout << input << endl;
}
return 0;
}
②
#include <string>
#include <sstream>
#include <iostream>
int main()
{
std::stringstream stream;
std::string result;
int i = 1000;
stream << i; //将int输入流
stream >> result; //从stream中抽取前面插入的int值
std::cout << result << std::endl; // print the string "1000"
运行结果:
(2)sort函数
1)sort
类别:排序
用途:①从小到大排序(默认) ②从大到小排序③less<数据类型>()//从小到大排序,greater<数据类型>()//从大到小排序
#include<cstdio>
#include<algorithm>
using namespace std;
int a[10]={9,6,3,8,5,2,7,4,1,0};
bool complare(int a,int b){
return a>b;
}
void Sort1(){
printf("从小到大 : ");
sort(a, a + 10);
for(int i = 0; i < 10; i++)
printf("%d ", a[i]);
}
void Sort2(){
printf("从大到小 : ");
sort(a, a + 10, complare);
for(int i = 0; i < 10; i++)
printf("%d ", a[i]);
}
int main(void){
printf("初始 : ");
for(int i = 0;i < 10; i++)
printf("%d ", a[i]);
printf("\n");
Sort1();
printf("\n");
Sort2();
return 0;
}
//数据类型是string,对string进行排序
#include<iostream>
#include<algorithm>
using namespace std;
int main(void){
string str[] = {
"adsfzcv", "a", "dsf", "werew"
};
for(int i = 0; i < 4; i++)
cout << str[i] << endl;
sort(str, str + 4, greater<string>());
for(int i = 0; i < 4; i++)
cout << str[i] << endl;
return 0;
}
(3)lower_bound()
1)lower_bound
用途:查找“大于或者等于x的第一个位置”,配合sort()
#include<cstdio>
#include<algorithm>
using namespace std;
int str[] = {12, 32, 43, 54, 3, 5, 2, 1};
int main(void) {
sort(str, str + 8);
int x = lower_bound(str, str + 8, 3) - str;
printf("%d %d", x, str[x]);
return 0;
}
(4)map集合
1)map
类别:容器
用途:键值对(两属性相关)
下面提供2种简单常用的操作。
//若map<string, int> month_name来表示"月份名字到月份编号"的映射,然后用month_name["July"]=7这样的方式来赋值
①
#include<iostream>
#include<map>
using namespace std;
int main(void){
map<string, int> Map;
map<string,int>::iterator it; //迭代去
Map.insert(pair<string, int>("AA", 1)); //增加元素
Map.insert(pair<string, int>("BB", 1));
for (it = Map.begin(); it != Map.end(); it++){ //循环
cout << it -> first << " " << it -> second << endl;
}
}
②
#include<iostream>
#include<map>
using namespace std;
int main(void){
map<long long,int> Map;
for(int i = 0 ; i < 5; ++i)
Map[i] = 1; //添加5个元素
for(int i = 2; i < 10; ++i){
if(Map.count(i)){ //是否存在这个元素
Map[i]++; //第二个键++
cout << "存在 " << Map[i] <<endl;
}else {
cout << i << "不存在"<<endl;
}
}
return 0;
}
③键值对<string, int> 增加int值
#include<iostream>
#include<map>
using namespace std;
int main(void){
int N;
while(cin >> N && N != 0){
int cnt = 0;
map<string, int> Map;
map<string, int>::iterator it;
string str;
for(int i = 0 ; i < N; ++i){
cin >> str;
for(it = Map.begin(); it != Map.end(); ++it){
if(str == it -> first)
(it -> second)++;
}
if(it == Map.end())
Map.insert(pair<string, int>(str, 1));
}
for(it = Map.begin(); it != Map.end(); ++it){
if(it -> second > cnt){
cnt = it -> second;
str = it -> first;
}
}
cout << str << endl;
}
return 0;
}
(5)优先队列
1)priority_queue
类别:容器
用途:优先队列(从小到大 或 从大到小)
详细说明:STL里面默认用的是 vector. 比较方式默认用 operator< , 所以如果你把后面俩个参数缺省的话,即priority_queue pq;
如果要用到小顶堆,则一般要把模板的三个参数都带进去。
STL里面定义了一个仿函数 greater<>,对于基本类型可以用这个仿函数声明小顶堆
优先队列就是大顶堆,队头元素最大。
下面简单常用的操作。
//push() :入队
//pop() :出队
//top() : 取队首元素(但不删除)
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
int main(void){
//greater 是从小到大,默认是从大到小
priority_queue<int , vector<int>, greater<int>> pq;
for(int i = 21; i < 31; ++i)
pq.push(i);
while(!pq.empty()){
printf("%d ", pq.top());
pq.pop();
}
return 0;
}
(6)vector集合
1)vector
类别:容器
用途:字符串中插入删除某个字符等
下面简单常用的操作。
#include<cstdio>
#include<vector>
using namespace std;
vector<char> vec;
void print(){
vector<char>::iterator it;
for (it = vec.begin(); it != vec.end(); ++it)
printf("%c ", *it);
printf("\n");
}
int main(void){
vec.clear();
vec.push_back('a');
vec.push_back('b');
vec.push_back('c');
vec.push_back('d');
vec.push_back('e');
vec.insert(vec.begin() + 2, 'f');
vec.size();
print();
vec.erase(vec.begin() + 2);
vec.size();
print();
return 0;
}