2017-01-12 1 views
-2

J'ai du mal à convertir le code C++ ci-dessous en une fonction C# équivalente, et je dois admettre que je n'ai aucune expérience avec C++. J'apprécierais vraiment de l'aide dans cette conversion.Syntaxe C# pour unordered_map

Pour être précis:

  1. Je comprends que unordered_map est un dictionnaire en C#, mais ce qui est l'équivalent pour strings((max_code * 11)/10) qui est passé dans la déclaration?

  2. Quel est l'équivalent pour INPUT &input, OUTPUT &output en C#? - Je veux passer un tableau d'octets à cette fonction et retourner un tableau d'octets.

... Merci

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 n'est pas un service de conversion, s'il vous plaît affiner la question à une ou deux choses que vous rencontrez un problème et poser une question spécifique à leur sujet. – BradleyDotNET

+0

SO n'est pas vraiment destiné à être un service d'écriture de code pour moi, les questions sont censées avoir un certain usage pour d'autres personnes même après que votre problème immédiat a été résolu. Une question qui cherche simplement la conversion d'une fonction * très * spécifique est peu susceptible d'atteindre ce niveau. Je suggérerais d'essayer et de venir avec des questions plus précises. – paxdiablo

+0

Excuses - J'ai édité mon message. – user3363391

Répondre

0

Pour répondre à la première

Il n'y a pas d'équivalent direct strings((max_code * 11)/10) en C#. Puisque C# base ses buckets sur la taille égale au premier nombre premier (De leur liste de nombres premiers magiques (https://referencesource.microsoft.com/#mscorlib/system/collections/hashtable.cs,19337ead89202585,references)) qui est plus grande que la quantité d'éléments dans le dictionnaire. En C++, vous spécifiez le nombre minimum de compartiments dans votre carte. Pour obtenir quelque chose de proche en C#, vous pouvez utiliser le paramètre capacity du constructeur du dictionnaire pour spécifier la capacité minimale du dictionnaire. Cependant, vous devez garder à l'esprit que la quantité de compartiments ne sera toujours pas la quantité que vous attendez de C + +. Ex.

Supposons max_code est 12.

strings((max_code * 11)/10) 

aurait 13 seaux.

Cependant, en C# les suivantes

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

aurait 17 seaux.

+0

Merci et cela a du sens! – user3363391