string也有极限

作者通过编写代码测试C++string的容量,发现随着不断添加空格,内存占用迅速增长,直到达到10亿多字节。这揭示了string类型在内存分配上的设计策略。

有一天,我闲来无事,想:string会不会有极限呢?

于是,我就打开Dev-C++

#include <bits/stdc++.h>
using namespace std;
int main(){
	string p;
	for(int i=1;;i++){
		p+=' ';
	}
	return 0;
}

这个代码是在string里一直加空格

运行后……

我一猜,就是string的极限到了。

我用freopen打开一个文件,叫test.txt

#include <bits/stdc++.h>
using namespace std;
int main(){
	freopen("test.txt","w",stdout);
	string p;
	for(int i=1;;i++){
		p+=' ';
		cout<<i<<endl;
	}
	return 0;
}

运行!

2分钟后……

已经生成了180MB的文件了,可是程序还没运行完。

【TWO THOUSANDS YEARS LATER】

uhh...

已经1GB了

所以……我看了看string的函数

哈哈!正合我意!

#include <bits/stdc++.h>
using namespace std;
int main(){
	string p;
	cout<<p.max_size();
	return 0;
}

max_size() 

我们得到了string的最长值是1073741820,也就是2²⁰-4

我觉得这是string给其他variable(比如说npos)的预留

本博客由百联又一博客冠名播出

C++ 中,将 `double` 类型转换为 `std::string` 类型的方法有多种,每种方法在精度控制、代码可读性和性能上各有特点。 ### 使用 `std::to_string` 转换 C++11 引入了 `std::to_string` 函数,可以将 `double` 类型直接转换为字符串,但该方法默认只保留六位小数,无法控制输出精度[^3]。 ```cpp #include <iostream> #include <string> int main() { double num = 3.1415926535897932384626433832795; std::string str = std::to_string(num); std::cout << str << std::endl; // 输出 3.141593 return 0; } ``` ### 使用 `std::ostringstream` 控制精度 为了实现更精确的输出,可以使用 `std::ostringstream` 结合 `std::setprecision` 和 `std::fixed` 来控制小数点后的位数[^4]。 ```cpp #include <iostream> #include <sstream> #include <iomanip> std::string DoubleToString(double value, unsigned int precision) { std::ostringstream out; if (precision > 0) out.precision(precision); out << std::fixed << value; return out.str(); } int main() { double dNum = 123.45678901234; std::string str = DoubleToString(dNum, 2); std::cout << str << std::endl; // 输出 123.46 return 0; } ``` ### 使用 `sprintf` 格式化输出 还可以使用 C 标准库函数 `sprintf`,通过格式字符串来控制输出精度。该方法需要手动管理内存,需注意缓冲区大小[^2]。 ```cpp #include <iostream> #include <cstring> std::string doubleToString(double val) { char* chCode = new char[20]; sprintf(chCode, "%.2lf", val); std::string str(chCode); delete[] chCode; return str; } int main() { double dNum = 123.45678901234; std::string str = doubleToString(dNum); std::cout << str << std::endl; // 输出 123.46 return 0; } ``` ### 保持高精度输出 若需保持更高精度(如 15 位小数),推荐使用 `std::ostringstream` 配合 `std::setprecision(15)` 和 `std::fixed`,以确保输出精确到双精度浮点数的极限[^4]。 ```cpp #include <iostream> #include <sstream> #include <iomanip> std::string DoubleToStringHighPrecision(double value) { std::ostringstream out; out.precision(15); out << std::fixed << value; return out.str(); } int main() { double d = 3.1415926535897932384; std::string str = DoubleToStringHighPrecision(d); std::cout << str << std::endl; // 输出 3.141592653589793 return 0; } ``` ### 总结 在实际开发中,选择哪种方法取决于具体需求。如果只需要简单转换,`std::to_string` 是最简洁的方式;若需控制精度,推荐使用 `std::ostringstream`;而 `sprintf` 则适用于需要格式化输出的场景,但需注意内存管理问题。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值