[C++雑記]int回転string

5837 ワード

int回転string
ここでは3つの方法を挙げ,それぞれ優劣がある.
1、複数の整数をstringに変換する
次のコードクリップは、正の整数がstringに変換されることを示します.
int low;
string answer;
while(n>0){
	low = n % 10;
	n = n / 10;
	answer += low + '0';
}

char temp;
for(int i = 0; i < answer.length()/2; i++){
	temp = answer[i];
	answer[i] = answer[answer.length()-i-1];
	answer[answer.length()-i-1] = temp;
}
負の整数の場合、boolタイプの値を1つ増やしてタグ付けし、負数を正数に変換してstring変換し、最後に負の番号を付ける必要があります.次のようになります.
<pre name="code" class="cpp">int n = -123480000;
bool isNegative = false;if(n<0){n = -n;isNegative = true;}int low;string answer;while(n>0){low = n % 10;n = n/10;answer += low + '0';}if(isNegative){answer += '-';}char temp;for(int i = 0; i < answer.length()/2; i++){temp = answer[i];answer[i] = answer[answer.length()-i-1];answer[answer.length()-i-1] = temp;}cout << answer;
 第3行到第7行判断需要转化的数是否为负数,如果是负数,那么需要将isNegative置为true,然后将负数取相反数。第16行到第18行根据isNegative的值,在字符串后加上负号,最后在将整个串取反,可以得到结果。 
 
该方法的优点:效率较高
该方法的缺点:只可以处理整数,不可以处理浮点数。被转化的整数的范围必须在数据类型的值域范围之内,比如,要转化int型值,那么范围要在-2147483648到2147483647之间。
2、使用strstream或者stringstream函数
引用1说明了这两个函数在C++中的出处,其中strstream是基于C语言的char*的,而stringstream是基于C++的string的,其实现的功能大体相同。在这里我是如此记忆的,因为C++string类有一个函数是c_str(),该函数是将C++string类转化为C字符串char*的一个函数。于是,只要是包含str的,都属于基于C语言char*的,其余的属于基于C++的string的。
C语言 C++
头文件<strstream> 头文件<sstream>
class strstreambuf class stringbuf
class istrstream class istringstream
class ostrstream class ostringstream
class strstream class stringstream
下面的代码使用了基于C语言的<strstream>来实现了int到string的转化:
#include<strstream>
using namespace std;

int n = 65535;
strstream ss;
string s;
ss << n;
ss >> s;
cout << s;

一部のブログではC++ベースのを推奨していますが、使い方は同じです.
なぜC++ベースのを推奨するブログがあるのかについては、C言語ベースのストリームはいくつかの詳細な処理がうまくいかない可能性があり、徐々に廃止される可能性があると説明しています.例証として例を実験した.vs 2010では、次のようなプログラムフラグメントが作成されています.
int _tmain(int argc, _TCHAR* argv[])
{
	double n = 635.866;
	strstream ss;
	string s;
	ss << n;
	s = ss.str();
	cout << s << endl;

	stringstream ss1;
	ss1 << n;
	s = ss1.str();
	cout << s << endl;

	system("pause");
	return 0;
}
実行結果は次のとおりです.
635.866屯屯屯屯屯屯屯屯屯屯妄
635.866
任意のキーを押して続行してください.
C言語ベースのを使用すると、結果的に問題が発生することがわかります.ただし、6行目の文をss>>sにシフトしても問題は発生しません.やはりC++ベースのがおすすめです.
C++ベースのを使用する場合、whileサイクルでint型をstring型に変える必要があるという問題に遭遇しました.stringstreamはサイクル中に内部の要素をタイムリーにクリアするのではなく,蓄積し続けることが分かった.次のコードに示します.
#include<iostream>
#include<string>
#include<sstream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
<span style="white-space:pre">	</span>int n;
<span style="white-space:pre">	</span>string s;
<span style="white-space:pre">	</span>stringstream ss1;
<span style="white-space:pre">	</span>cout << "input: ";
<span style="white-space:pre">	</span>while( cin >> n ){
<span style="white-space:pre">		</span>ss1 << n;
<span style="white-space:pre">		</span>s = ss1.str();
<span style="white-space:pre">		</span>cout << "output: " << s << endl;
<span style="white-space:pre">		</span>cout << "input: ";
<span style="white-space:pre">	</span>}


<span style="white-space:pre">	</span>system("pause");
<span style="white-space:pre">	</span>return 0;
}
出力結果:
input: 12345
output: 12345
input: 67890
output: 1234567890
最後のoutputは、最初のループのデータを蓄積していることがわかります.この問題を解決するには、stringstreamオブジェクトss 1をループ内部で宣言する2つの方法があります.これにより、ループのたびに新しいストリームオブジェクトが作成され、新しいストリームオブジェクト内部が空になります.しかし、ストリームオブジェクトの作成と破棄はリソースを非常に占有するため、非効率です.2つ目の方法はstr(「」)関数を使用して、ストリームを使用する前に前回残ったデータをクリーンアップすることです.次のコードの14行目に注意してください.
#include<iostream>
#include<string>
#include<sstream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	int n;
	string s;
	stringstream ss1;
	cout << "input: ";
	while( cin >> n ){
		ss1.str("");
		ss1 << n;
		s = ss1.str();
		cout << "output: " << s << endl;
		cout << "input: ";
	}

	system("pause");
	return 0;
}
clear()関数ではなくstr("")を使用しなければならないのはなぜですか?引用3の博文を参照してください.
この方法の利点:
コード量が少なく、いくつかの文を呼び出すだけで変換が完了します.また、大規模な変換タスクを一括で完了できます.
浮動小数点数の変換を完了できます.  
この方法の欠点:
ストリームの作成にはリソースがかかります.ループ内で絶えず新しいストリームを作成してはいけません.
浮動小数点数を変換すると、6桁の有効な数字を保持できます.(この点は変えられるはずです)
3、itoa関数
itoa関数の場合C言語の関数で、関数の原型は以下の通りです.
char *itoa( int value, char *string,int radix);
変換後のchar*を直接返すことも、2番目のパラメータstringに格納することもできます.
この方法の少し:非常に簡単で、異なる進数に変換することができます.
この方法の欠点:整数値のみを変換できる
拡張:
itoa()整数値を文字列に変換
litoa()ロング整数値を文字列に変換
ultoa()符号なしロング整数値を文字列に変換
参照:
1、網易ブログシリアルポートとネット知識VC Delphi C++標準ライブラリにおけるsstreamとstrstrstreamの違い
2、 bbs csdn
3、163ブログ期待stringstream clear()を裏切らない