Stringクラスのインタビューの回答

あなたはStringクラス、限られた時間を達成することを可能にする一般的な面接の質問C ++は、あなたがのstd ::文字列関数を持つことが必要ですが、少なくとも、適切にリソースを管理することができ必要とすることはできません。具体的に:

1は、int型の変数のように定義され、割り当て、レプリケーションをサポートすることができます。
図2は、関数型のパラメータと戻り型として使用することができます。
図3は、即ちVALUE_TYPEベクトル/リスト/両端キューは、ライブラリコンテナの要素型として使用することができます。(さらなる要件を省略するとしてSTDはkey_typeをマップ::)。
言い換えれば、あなたは、文字列の次のコードを介して実行するようにコンパイルしないと、メモリのエラー条件されていることを確認することができます。

1つの空隙FOO(列X)
2 {
3}
文字列&X CONST)4ボイドバー
5 {
6}
7文字列バズ()
8 {
9文字列RET( "世界")。
10リターンRET;
11}
12のint main()の
13 {
14列S0。
15文字列S1( "こんにちは");
16文字列s2(S0)。
17列S3 = S1。
18 S2 = S1。
19 FOO(S1)。
20バール(S1)。
21のfoo( "一時的");
22バー( "一時的");
23ストリングS4 =バズ()。
24のstd ::ベクトル<文字列> SVEC。
25 svec.push_back(S0)。
26 svec.push_back(S1)。
27 svec.push_back(バズ())。
28 svec.push_back( "良い仕事")。
29}
本論文では、私は面接のための答えは、(これも間違っているホワイトボードに書かれた)正当性と実装が容易な、効率の無重視を強調したと思います。ある意味では空間(コード単純)のための時間(走行速度)であることを特徴とすることができます。

まず、最も簡単な文字列のcharの一つだけ、データメンバを選択するメンバ変数。利点は、実装が容易であり、欠点は、特定の操作(例えば、サイズ()は線形時間であろう)の高い複雑です。インタビューの間に間違いなしの書き込みコードするために、文字列この設計は、1つの文字であるデータメンバー。そして、次のように所定の不変:データ列オブジェクトが有効である保証は機能の交配STR C言語*()ファミリを容易にするために、DATA_は「\ 0」終了NULL、ではありません。

第二には、アクション、建設、デストラクタは、コンストラクタのサポートをコピーするかを決める、割り当てが(今コピー制御と呼ばれる以前の総称ビッグ3、)のこれらの種類を持っているはずです。ビットは、深い、C ++をドリルとも割当てを有することができる移動構造体11を移動させる場合。フォーカスのために、我々は、高負荷のようなオペレータを[]考慮していません。

このようなコードは、基本的にはステレオタイプです。

1つの#include <ユーティリティ>
2の#include <string.hの>
3クラスString
4 {
5公共:
6文字列()
7:データ(新しいCHAR [1])
8 {
9件の*データ
= '\ 0'。
10}
11文字(CONSTチャーSTR)
12:データ(新しいCHAR [STRLEN(STR)+ 1])
13 {
14 strcpyの(データ
、STR)。
15}
16文字(CONST文字列&RHS)
17:データ(新しいCHAR [rhs.size()+ 1])
18 {
19 strcpyの(データ
、rhs.c_str())。
20}
21 /
C ++ 11に委任コンストラクタ
22文字(CONST文字列&RHS)
文字列(rhs.data:23
24 {
25}
26 * /
27〜文字列()
28 {
29、削除[]データ

30}
31 / トラディショナル:
32文字列&演算子=(CONST文字列&RHS)
33 {
34列TMP(RHS)。
35スワップ(TMP)。
36は返す
これを。
37}
38 /
39文字列&演算子=(文字列RHS)//はい、パスによって値
40 {
41スワップ(RHS)。
42は返す
これを。
43}
44 // C ++ 11
45文字(文字列&& RHS)
46:データ(rhs.data
47 {
48 rhs.data_ = nullptr。
49}
50文字列&演算子=(文字列&& RHS)
51 {
52スワップ(RHS)。
53リターンこの;
54}である
55 //アクセッサ
56がサイズであるTのサイズ()constは
57 {で
58リターンstrlenを(データ
);
59}
60 CONSTチャー
C STR()constは
61 {で
62リターンデータであり

63}である
ボイド64スワップ(文字列&RHS)
65 {
66 STD ::スワップ(データ、rhs.data);
67}
プライベート68:
69のchar * DATA_;
70}
いくつかの点注コード:

唯一のコンストラクタ新しいchar型と呼ばれる[]、のみ削除デストラクタを呼び出します[]。
代入演算子は、「C ++プログラミング仕様」現代は言葉遣いをお勧めします使用しています。
各機能は、1つまたは2つのライン、全く条件が決定されていません。
デストラクタはNULLにDATA_かどうかをチェックされていません。
コンストラクタ文字列(のconstのchar * str)文字列strは無限の議論の話題となっている合法性をチェックしませんでした。ここでは、初期化リストの中には、STRを使用するため、関数のassertの本体()は無意味です。
これはおそらく文字列を達成最も簡潔です。

おすすめ

転載: blog.51cto.com/11395518/2485418