我正在努力将以下C ++代码转换为等效的C#函数,我必须承认我没有使用C ++的经验。我真的很感激这次转换的一些帮助。
具体来说:
我知道unordered_map是C#中的字典,但是在声明中传递的strings( (max_code * 11) / 10 )
是等价的吗?
C#中INPUT &input, OUTPUT &output
的等价物是什么? - 我想将一个字节数组传递给这个函数并返回一个字节数组。
...谢谢
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 :(得分:0)
回答第一个
在C#中没有直接等同于strings( (max_code * 11) / 10 )
。由于C#将其桶的大小等于第一个素数(来自它们的魔术素数列表(https://referencesource.microsoft.com/#mscorlib/system/collections/hashtable.cs,19337ead89202585,references)),这大于字典中元素的数量。在C ++中,您可以在地图中指定最小数量的存储桶。
要在C#中实现与它接近的内容,您可以使用字典构造函数的capacity
参数来指定字典的最小容量。
但是你必须记住,桶的数量仍然不会是你期望从C ++获得的数量。实施例
我们假设max_code
为12。
strings( (max_code * 11) / 10 )
将有13个桶。
但是在C#中如下
new Dictionary<int,string>(capacity: (max_code * 11) / 10);
将有17个桶。