2017-01-12 13 views
-2

私は下のC++コードを同等のC#関数に変換するのに苦労しています。私はC++の経験がないことを認めなければなりません。私は本当にこの変換のいくつかの助けに感謝します。unordered_mapのC#構文

。具体的には:

  1. 私はunordered_mapは、宣言に渡されるstrings((max_code * 11)/10)の等価いただきました!C#での辞書であるが、ことを理解できますか?

  2. INPUT &input, OUTPUT &outputのC#での対応はなんですか?私はバイト配列をこの関数に渡し、バイト配列を返す必要があります。

おかげで...

void decompress(INPUT &input, OUTPUT &output, const unsigned int max_code = 32767 ) 
{ 
    input_code_stream<INPUT> in(input, max_code); 
    output_symbol_stream<OUTPUT> out(output); 

    std::unordered_map<unsigned int,std::string> strings((max_code * 11)/10); 
    for (int unsigned i = 0 ; i < 256 ; i++) 
     strings[i] = std::string(1,i); 
    std::string previous_string; 
    unsigned int code; 
    unsigned int next_code = 257; 
    while (in >> code) { 
     if (strings.find(code) == strings.end()) 
      strings[ code ] = previous_string + previous_string[0]; 
     out << strings[code]; 
     if (previous_string.size() && next_code <= max_code) 
      strings[next_code++] = previous_string + strings[code][0]; 
     previous_string = strings[code]; 
    } 
} 
+0

SOはコンバージョンサービスではありませんので、問題が発生している問題の1つまたは2つに絞り込んで、それらについて特定の質問をしてください。 – BradleyDotNET

+0

SOは実際に私のコードを書くためのサービスではありません。あなたの問題が直ちに解決された後でも、質問は他の人に何らかの役に立つことが想定されています。単に*非常に特殊な関数の変換を求める質問は、そのレベルまで上がる可能性は低いです。私は、より具体的な質問を試してみることをお勧めします。 – paxdiablo

+0

申し訳ありません - 投稿を編集しました。 – user3363391

答えて

0

最初の1

に答えるためにC#でstrings((max_code * 11)/10)に直接相当するものはありません。 C#はそのバケットを、辞書内の要素の量よりも大きい第1の素数(魔法の素数リスト(https://referencesource.microsoft.com/#mscorlib/system/collections/hashtable.cs,19337ead89202585,references)から)に等しいサイズに基づいているからです。 C++では、マップ内にバケツの最小量を指定します。

C#でそれに近いものを実現するには、辞書のコンストラクタのパラメータcapacityを使用して、辞書の最小容量を指定します。

ただし、バケットの量は、C++からの期待どおりの量ではないことに注意してください。 Ex。

は13個のバケツを持っているでしょうのは、max_codeは12

strings((max_code * 11)/10) 

であると仮定しましょう。

は、しかし、C#で、次の

new Dictionary<int,string>(capacity: (max_code * 11)/10); 

は17個のバケツを持っているでしょう。

+0

ありがとうございました! – user3363391