web-dev-qa-db-ja.com

char(char *ではない)からstd :: stringへの優先変換

私はcharを持っていますが、これは_std::string_に変えたいと思っています。 std::string(char)はもちろん存在しません。 char配列を作成してコピーしたり、文字列ストリームや他の多くの小さな迂回ルートを通過したりできます。現在、私は_boost::lexical_cast_を好みますが、それでもこの単純なタスクには冗長すぎるようです。それで、好ましい方法は何ですか?

42

std::stringには、数値と文字を受け取るコンストラクターがあります。キャラクターは与えられた回数繰り返されます。したがって、以下を使用する必要があります。

std::string str(1, ch);
79

charを取るオーバーロードを使用するだけですか?

つまり、string(1, 'A')

5
messenger

答えに追加するには、単純に初期化子リストを使用できます

std::string str = {ch};
4
Gaurav Pant

2つのイテレータを取る文字列コンストラクタを引き続き使用できます。

char c = 'x';
std::string(&c, &c + 1);

更新:

ジェームスとGManの良い質問です。 Derek M. Jonesが自由にダウンロードできる「The New C Standard」で「pointer past」を検索したところ、最初のヒットは次のとおりでした。

式Pが配列オブジェクトの要素を指し、式Qが同じ配列オブジェクトの最後の要素を指す場合、Q + 1がPを指していなくても、ポインター式Q + 1はP ...よりも大きく比較されます。配列オブジェクトの要素...

セグメント化されたアーキテクチャーでは、セグメントの終わりを超えてポインターをインクリメントすると、アドレスはセグメント化されたアーキテクチャーをそのセグメントの先頭(通常はアドレス0)にラップします。配列がそのようなセグメント内に割り当てられている場合、実装は、配列の後に終了アドレスを超えるためのスペースがあることを確認する必要があるか、または他の実装手法を使用してこのケースを処理します(たとえば、セグメント使用されるのはポインターの表現の一部であり、終了セグメント値を過ぎた特別なものが割り当てられる場合があります)...

C関係演算子モデルを使用すると、オブジェクトへのポインターを配列オブジェクトへのインデックスと同じように扱うことができます。 2つの異なる配列オブジェクト(より大きなオブジェクトの両方のサブオブジェクトではない)へのインデックス間の関係比較は、ほとんど意味がなく、標準はそのようなポインターのサポートを定義していません。一部のアプリケーションは、ストレージ内のさまざまなオブジェクトの相対位置に関する情報を利用する必要があります。ただし、この使用法は、委員会が動作を定義するモデルを指定するのに十分な一般的有用性があるとは見なされていません...

ほとんどの実装は、ポインタ型の値に対する操作の前にチェックを実行しません。ほとんどのプロセッサは、算術型に使用するのと同じ命令を使用して、ポインタ型を含む関係比較を実行します。セグメント化メモリアーキテクチャを使用するプロセッサの場合、ポインタ値は、多くの場合、セグメント番号とそのセグメント内のオフセットの2つのコンポーネントを使用して表されます。この表現の結果として、単一のセグメント内に収まるようにオブジェクトのストレージを割り当てることには多くの利点があります(つまり、オブジェクトのストレージがセグメントの境界にまたがらない)。 1つの利点は、一部の関係演算子の生成されたマシンコードを含む最適化であり、セグメントオフセットコンポーネントをチェックするだけで済みます。これは、pとqが異なるオブジェクトを指している場合に、p> = qはfalseであるが、p> qはtrueであるという状況につながる可能性があります。

3

これはgcc C++ 4.9.2で動作します( http://ideone.com/f3qhTe

#include <iostream>
using namespace std;

int main() {
    // your code goes here
    std::string test;

    test = (char) 76;
    test += (char) 77;
    test += (char) 78;
    test += (char) 79;

    std::cout << "test contains: " << test << std::endl;
    return 0;
}
2
Sascha