【暖*墟】各种OI常见小片段qwq

【二分图的判定】给定一个具有n个顶点的图。要给图上每个顶点染色,并且要使相邻的顶点颜色不同。判断是否能最多用两种颜色进行染色。题目保证没有重边和自环。概念:把相邻顶点染成不同颜色的问题叫做图的着色问题。对图进行染色所需要的最小颜色数称为最小着色度。最小着色度为2的图称作二分图。 分析√:如果只用两种颜色,那么确定一个顶点的颜色之后,和它相邻的顶点的颜色也就确定了。    因此,选择任意一个顶点出发...
摘要由CSDN通过智能技术生成



【map<int,int>::iterator it;  】

map<int,int>::iterator it;  //定义一个map类型变量,记为it
for(it=M.begin();it!=M.end();it++)  // 直接用it取出M中所有的map值

这种方法能够取出保存在map容器里面的数据。

%c:输入输出char(字符)类型的字符
%d:输入输出int(整型)类型的整型数字
%s:输入输出char类型的字符串
%u:输入输出unsigned(无符号)类型的数
%lu:表示输出无符号长整型整数


【断言——assert的用法】

  assert()的用法像是一种“契约式编程”。程序在我的假设条件下,能够正常良好的运作。相当于if语句:

if(假设成立)
{
     程序正常运行;
}
else
{
      报错&&终止程序!(避免由程序运行引起更大的错误)  
}

  但是这样写的话,就会有无数个if语句,甚至会出现,一个if语句的括号从文件头到文件尾,并且大多数情况下,我们要进行验证的假设,只是属于偶然性事件,又或者我们仅仅想测试一下,一些最坏情况是否发生,所以这里有了assert().

   assert宏的原型定义在assert.h中,其作用是如果它的条件返回错误,则终止程序执行. 

1 #include "assert.h" 
2 void assert( int expression );

  assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。
 使用assert的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。 
  在调试结束后,可以通过在包含#include 的语句之前插入 #define NDEBUG 来禁用assert调用,示例代码如下: 

1 #include 
2 #define NDEBUG 
3 #include

   用法总结与注意事项: 

  1)在函数开始处检验传入参数的合法性 

 1 int resetBufferSize(int nNewSize) 
 2 { 
 3 //功能:改变缓冲区大小, 
 4 //参数:nNewSize 缓冲区新长度 
 5 //返回值:缓冲区当前长度 
 6 //说明:保持原信息内容不变 nNewSize<=0表示清除缓冲区 
 7 assert(nNewSize >= 0); 
 8 assert(nNewSize <= MAX_BUFFER_SIZE); 
 9  
10 ... 
11 } 

  2)每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败
  》》不好: assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize);   
  》》好的:  assert(nOffset >= 0); 
      assert(nOffset+nSize <= m_nInfomationSize);
  3)不能使用改变环境的语句,因为assert只在DEBUG个生效,如果这么做,会使用程序在真正运行时遇到问题 
  错误: assert(i++ < 100) 
     这是因为如果出错,比如在执行之前i=100,那么这条语句就不会执行,那么i++这条命令就没有执行。 
  正确: assert(i < 100) 
      i++;
  4)assert和后面的语句应空一行,以形成逻辑和视觉上的一致感
  5)有的地方,assert不能代替条件过滤   

  
  程序一般分为Debug 版本和Release 版本,Debug 版本用于内部调试,Release 版本发行给用户使用。断言assert 是仅在Debug 版本起作用的宏,它用于检查“不应该”发生的情况。以下是一个内存复制程序,在运行过程中,如果assert 的参数为假,那么程序就会中止(一般地还会出现提示对话,说明在什么地方引发了assert)。 

以下是使用断言的几个原则

(1)使用断言捕捉不应该发生的非法情况。不要混淆非法情况与错误情况之间的区别,后者是必然存在的并且是一定要作出处理的。 (2)使用断言对函数的参数进行确认。(3)在编写函数时,要进行反复的考查,并且自问:“我打算做哪些假定?” 一旦确定了的假定,就要使用断言对假定进行检查。(4)一般教科书都鼓励程序员们进行防错性的程序设计,但要记住这种编程风格会隐瞒错误。当进行防错性编程时,如果“不可能发生”的事情的确发生了,则要使用断言进行报警。 
  
  ASSERT ()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免导致严重后果,同时也便于查找错误。  

ASSERT只有在Debug版本中才有效,如果编译为Release版本则被忽略。 

【fill_n函数用法】

fill 和fill_n函数称为生成和变异算法,也就是说这两个函数只能对输入范围内已存在的元素进行操作

如果试图对空容器进行fill_n操作,会导致严重的运行错误。所以要检查目标的大小是否足以存储要写入的元素。

fill函数的作用是:将一个区间的元素都赋予val值。  fill(vec.begin(), vec.end(), val);  // val为将要替换上的值。

fill_n函数的作用是:从迭代器指向的元素开始,将指定数量的元素设置为给定的值。  fill_n(vec.begin(),10,val);

注意: 不能在没有元素的空容器上调用fill_n函数。

为了保证算法有足够的元素存储输出数据,我们使用“插入迭代器”,可以给基础容器添加元素。

使用 back_inserter 的程序需要包含头文件#include<iterator>,将上面的程序改写成:

#include <iterator>  
vector<int> vec; //定义一个空容器  
fill_n(back_inserter(vec),10,val);  

在这个程序中,fill_n() 函数每写入一个值,都会通过back_inserter生产的插入迭代器实现。

效果相当于在vec上调用push_back,在vec末尾添加10个元素。


【int main(int argc, char* argv[])用法】

argc是main()函数输入参数的个数。

argv[]是argc个参数,其中argv[0]通常指向程序中的可执行文件的文件名。

在有些版本的编译器中还包括程序文件所在的路径。

argv[1],argv[2]…是用户输入的参数。

下面用一个简单例子来展示函数用法-------代码(名为test.cpp):

#include<iostream>
using namespace std;

int main(int argc, char* argv[]){
    int i;
    for(i=0;i<argc;i++){
        cout<<"argv ["<<i<<"] = "<<argv[i]<<endl;
    }
    return 0;
}

编译后生成文件test.exe.进入到该exe文件所在目录。 输入:test2 a b c d e f g结果:
这里写图片描述

可见argv[0]通常为程序名,并且argc为自动记录所输入参数的个数。


【C++ string assign()赋值常用方法】
函数assign()常用在给string类变量赋值.

常用方法有:

1,直接用另一个字符串赋值.如:  str2.assign(str1); //用str1给str2赋值.

2,用另一个字符串的一个子串赋值.如:  str3.assign(str1, i, j); //用str1中i~j串给str2赋值.

3,用一个字符串的前一段子串赋值.如:  str4.assign("World", 4); //str4中只有world的前4个字符

4,用几个相同的字符赋值.如:  str5.assign(10, 'c'); //(数量,字符/字符串)

#include<iostream>
#include<string>
using namespace std;

int main(){
    string str1("hello"); //string 可以这样赋值哦
    string str2,str3,str4,str5;
    //====================================

    str2.assign(str1); //直接用另一个字符串赋值

    str3.assign("World", 4); //用另一个字符串的一个子串赋值

    str4.assign(str1, 2, 3); //用str1中第二位‘l’后三位‘llo’给str2赋值.
   
    str5.assign(10, 'c');

    //====================================
    cout<<str1<<endl;
    cout<<str2<<endl;
    cout<<str3<<endl;
    cout<<str4<<endl;
    cout<<str5<<endl;
    //====================================
    system("pause");
    return 0;
}

/*结果为:
hello
hello
Worl
llo
cccccccccc    */
 


【auto 指定符

对于变量,指定其类型将从其初始化器自动推导而出。

对于函数,指定其返回类型是尾随的返回类型或将从其 return 语句推导出

对于非类型模板形参,指定其类型将从参数推导出。

1) 在块作用域、命名空间作用域、循环初始化语句等中声明变量时,关键词 auto 可用作类型指定符。

只要初始化器的类型被确定,则编译器会用来自函数调用的模板实参推导规则所决定的类型替换关键词 auto (细节见模板实参推导)。关键词 auto 可与修饰符组合,如 const& ,它们将参与类型推导。例如,给出 const auto

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值