cout

丢人笔记:黑科技——使用streambuf加速读入输出

血红的双手。 提交于 2020-03-15 19:42:58
UPD20191125:我发现我又丢人了,sgetc只会读取缓冲区当前字符而不会前移读取位置,想要读取并前移读取位置应该用sbumpc。。。   一般情况下,在C++中,iostream内的cin和cout是比scanf和printf慢的,这主要是为了同时兼容iostream和stdio,iostream与stdio的缓冲区被绑到了一起,以及cin和cout的stream是绑定在一起的,这使得cin和cout有额外的开销   为了提高cin和cout的效率,我们可以取消iostream与stdio的同步,以及cin和cout的stream的绑定: 1 std::ios::sync_with_stdio(false); 2 cin.tie(NULL); 3 cout.tie(NULL);   这样cin与cout就比scanf和printf快了。在本机测试上,iostream甚至比stdio快了6倍左右。然而这样做之后,就不可以将iostream与stdio混用了,然而输入量较大的时候,这种方法仍然无能为力   在stdin中,我们有getchar,想要追求更快的速度,我们有fread   在iostream中我们同样可以达到同样的效率,甚至更快:   首先要获取cin的streambuf: std::streambuf *fb = cin.rdbuf();  

C ++中的'printf'与'cout'

时间秒杀一切 提交于 2020-03-15 10:38:20
在C ++中 printf() 和 cout 什么区别? #1楼 更多差异:“printf”返回一个整数值(等于打印的字符数),“cout”不返回任何内容 和。 cout << "y = " << 7; 不是原子的。 printf("%s = %d", "y", 7); 是原子的。 cout执行类型检查,printf没有。 没有相当于 "% d" iostream #2楼 令我感到惊讶的是,这个问题中的每个人都声称 std::cout 比 printf 更好,即使这个问题只是要求差异。 现在,有一个区别 - std::cout 是C ++,而 printf 是C(但是,你可以在C ++中使用它,就像C中 几乎 所有其他东西一样)。 现在,我会在这里说实话; printf 和 std::cout 都有它们的优点。 真正的差异 可扩展性 std::cout 是可扩展的。 我知道人们会说 printf 也是可扩展的,但是C标准中没有提到这样的扩展(所以你必须使用非标准功能 - 但是甚至不存在常见的非标准功能),并且这样的扩展是一个字母(因此很容易与已存在的格式冲突)。 与 printf 不同, std::cout 完全依赖于运算符重载,因此自定义格式没有问题 - 您所做的就是定义一个子程序,将 std::ostream 作为第一个参数,将您的类型作为第二个参数。 因此,没有命名空间问题

C++学习笔记--从虚函数说开去

。_饼干妹妹 提交于 2020-03-14 04:28:03
虚函数与纯虚函数 : 虚函数:在某基类中声明为virtual并在一个或多个派生类中被重新定义的成员函数,virtual 函数返回类型 函数名(参数表){函数体;} ,实现多态性, 通过指向派生类的基类指针或引用 ,访问派生类中同名覆盖成员函数。注意虚函数在基类中是有定义的,即便定义是空。 纯虚函数:在基类中是没有定义的,必须由派生类重定义实现,否则不能由对象进行调用。 看下面的例子: #include<iostream> using namespace std; class Cshape { public: void SetColor(int color){m_nColor=color;} virtual void Display(void){}; private: int m_nColor; }; class Crectangle:public Cshape{ //公有继承 public: }; void main() { Crectangle obRectangle; Cshape* pShape=&obRectangle; pShape->Display(); } 上面例子中,Display是虚函数,虽然是空定义,并且在派生类中没有重写该函数,但是上面的代码在编译阶段不会出错,而是在链接时出错,而如果将Display声明为纯虚函数,即 virtual void Display

在没有循环或条件的情况下打印1到1000

只谈情不闲聊 提交于 2020-03-13 19:34:44
任务 :打印数字从1到1000,不使用任何循环或条件语句。 不要只写1000次 printf() 或 cout 语句。 你会怎么用C或C ++做到这一点? #1楼 编译时间递归! :P #include <iostream> template<int N> struct NumberGeneration{ static void out(std::ostream& os) { NumberGeneration<N-1>::out(os); os << N << std::endl; } }; template<> struct NumberGeneration<1>{ static void out(std::ostream& os) { os << 1 << std::endl; } }; int main(){ NumberGeneration<1000>::out(std::cout); } #2楼 printf("%d\n", 2); printf("%d\n", 3); 它不会打印 所有 数字,但会打印“从1到1000打印数字”。 赢得暧昧的问题! :) #3楼 以下是我所知道的三种解决方案。 第二个可能是有争议的。 // compile time recursion template<int N> void f1() { f1<N-1>(); cout << N <<

L1-006. 连续因子

房东的猫 提交于 2020-03-11 10:14:48
一个正整数N的因子中可能存在若干连续的数字。例如630可以分解为3*5*6*7,其中5、6、7就是3个连续的数字。给定任一正整数N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。 输入格式: 输入在一行中给出一个正整数N(1<N<2 31 )。 输出格式: 首先在第1行输出最长连续因子的个数;然后在第2行中按“因子1*因子2*……*因子k”的格式输出最小的连续因子序列,其中因子按递增顺序输出,1不算在内。 输入样例: 630 输出样例: 3 5*6*7 思路:对题意没有理解清楚,所有调试了一会,这个题不是说所有因子,而是能相乘等于N的因子。好比说12这个数,正确的输出应该是2 2*3,而不是3 2*3*4;然后还得注意极值情况,比如0输出1 0、1输出1 1,2输出1 2等等。 #include<stdio.h> #include<set> #include<vector> #include<functional> #include<iostream> #include<algorithm> using namespace std; int main() { int num; cin >> num; vector<int>vec; set<int>se; vec.push_back(num); for (int i = 2; i <= (int)sqrt(num);

P5008 [yLOI2018] 锦鲤抄(Tarjan+贪心)

时光总嘲笑我的痴心妄想 提交于 2020-03-10 08:20:55
洛谷 题意: 给出一个有向图,每次可以删除存在入度的点及其出边,每次删除一个点可以获得其权值。 问最终能够获得的最大权值为多少。 思路: 考虑DAG:我们直接倒着拓扑序来选,即可将所有入度不为 \(0\) 的点选完。 若不为DAG,考虑 \(tarjan\) 求出强连通分量,分析可以发现:对于一个单独的强连通分量,假设其点数为 \(n\) ,那么可以选择 \(n-1\) 个点;若其入度不为 \(0\) ,那么强连通分量中所有点都可以选择。 然后直接这样来搞就行。 证明...我也不会,在纸上画画就行了。 #include <bits/stdc++.h> #define MP make_pair #define fi first #define se second #define sz(x) (int)(x).size() #define all(x) (x).begin(), (x).end() #define INF 0x3f3f3f3f // #define Local #ifdef Local #define dbg(args...) do { cout << #args << " -> "; err(args); } while (0) void err() { std::cout << '\n'; } template<typename T, typename...Args

C++笔记(六)——I/O&异常

荒凉一梦 提交于 2020-03-10 05:16:32
iostream 标准库 提供了 cin 和 cout 方法分别用于从标准输入读取流和向标准输出写入流。 · 标准库 fstream 定义了三个新的数据类型用于文件的访问。 · open() 函数 是 fstream、ifstream 和 ofstream 对象的一个成员。open() 成员函数的 第一参数指定要打开的文件的名称和位置,第二个参数定义文件被打开的模式 。可以把以上两种或两种以上的模式结合使用。 void open ( const char * filename , ios :: openmode mode ) ; //以写入模式打开文件,并希望截断文件,以防文件已存在 ofstream outfile ; outfile . open ( "file.dat" , ios :: out | ios :: trunc ) ; //打开一个文件用于读写 ifstream afile ; afile . open ( "file.dat" , ios :: out | ios :: in ) ; · close() 函数 用于关闭文件(通常应该在程序结束前关闭),close() 函数是 fstream、ifstream 和 ofstream 对象的一个成员。 void close ( ) ; ·使用流插入运算符( << )向文件写入信息,使用的是 ofstream 或

【实验7】 流类库与输入输出

岁酱吖の 提交于 2020-03-10 04:59:08
11-3: 1 #include <iostream> 2 #include <fstream> 3 4 using namespace std; 5 6 int main() 7 { 8 ofstream out("test1.txt"); 9 out << "已成功写入文件!" << endl; 10 out.close(); 11 return 0; 12 } 截图略…… 11-4 1 #include <iostream> 2 #include <fstream> 3 #include <string> 4 5 using namespace std; 6 7 int main() 8 { 9 string x; 10 ifstream in("E:\\程序\\题目\\题目6\\11-3\\11-3\\test1.txt"); 11 in >> x; 12 in.close(); 13 cout << x << endl; 14 return 0; 15 } 截图略…… 11-7 1 #include <iostream> 2 3 using namespace std; 4 5 int main() 6 { 7 ios_base::fmtflags original_flags = cout.flags(); //保存当前参数设置 8 cout << 812 << '|'

C++输入输出流

拟墨画扇 提交于 2020-03-10 04:58:17
一、C++输入输出流的含义 以前所用到的输入和输出,都是以终端为对象的,即从键盘输入数据,运行结果输出到显示器屏幕上。从操作系统的角度看,每一个与主机相连的输入输出设备都被看作一个文件。程序的输入指的是从输入文件将数据传送给程序,程序的输出指的是从程序将数据传送给输出文件。C++的输入与输出包括以下3方面的内容:   1、对系统指定的标准设备的输入和输出。简称标准I/O。(设备)   2、以外存磁盘(或光盘)文件为对象进行输入和输出。简称文件I/O。(文件)   3、对内存中指定的空间进行输入和输出。简称串I/O。(内存) 二、 C++的输入输出流 输入和输出是数据传送的过程,数据如流水一样从一处流向另一处。C++形象地将此过程称为流(stream)。C++的输入输出流是指由若干字节组成的字节序列,这些字节中的数据按顺序从一个对象传送到另一对象。流表示了信息从源到目的端的流动。在输入操作时,字节流从输入设备(如键盘、磁盘)流向内存, 在输出操作时,字节流从内存流向输出设备(如屏幕、打印机、磁盘等)。流中的内容可以是ASCII字符、二进制形式的数据、图形图像、数字音频视频或其他 形式的信息。 实际上,在内存中为每一个数据流开辟一个内存缓冲区,用来存放流中的数据。当用cout和插入运算符“<<”向显示器输出数据时,先将这些数据送到程序中的输出缓冲区保存,直到缓冲区满了或遇到endl

实验7 流类库和输入输出

China☆狼群 提交于 2020-03-10 04:54:43
基础练习 (1)课本习题11-7 #include <iostream> using namespace std; int main() { ios_base::fmtflags original_flags = cout.flags(); //保存格式化参数设置 cout<< 812<<'|'; cout.setf(ios_base::left,ios_base::adjustfield); //设置对齐方式为左对齐 cout.width(10); //将输出宽度设置为10 cout<< 813 << 815 << '\n'; cout.unsetf(ios_base::adjustfield); //取消对齐方式的设置 cout.precision(2);// 设置浮点数输出精度值为2 cout.setf(ios_base::uppercase|ios_base::scientific); //设置为浮点数的显示参数 cout << 831.0 ; cout.flags(original_flags); //恢复保存的格式化参数设置 return 0; } 运行截图: (2)课本习题11-3 #include <iostream> #include <fstream> using namespace std; int main() { ofstream file; file