3

Javaで書いたいくつかのプログラムを変換してC++を学ぼうとしています。1 つは、テキスト入力を受け取り、それを DNA のように見せる暗号化プログラム ( AGCTGTGCT... ) です。それぞれ 4 塩基の 256 個のコドンを使用して 64 文字を暗号化できます。( "A" = "TGGC", "B" = "ATGC"...) Java ではhashmap<String, String[]>、キーが暗号化される文字で、値が 4 つの文字列の配列である a を作成します。ここで、各文字列は暗号化された文字を置き換えるためにランダムに選択されるコドン。

C++ では、マップを使用して同じことをしようとしていますが、理解できないエラーが発生します。コドンテーブルを作成しようとするコードは次のとおりです。

// iterate through the characters and select 4 codons from the list
for(int i = 0; i < 64; i++){
    codonTable[charList[i]][0] = originalCodonList[4 * i];
    codonTable[charList[i]][1] = originalCodonList[4 * i + 1];
    codonTable[charList[i]][2] = originalCodonList[4 * i + 2];
    codonTable[charList[i]][3] = originalCodonList[4 * i + 3];

    }
}

charListは、64 個のエンコード可能な文字 (実際には文字列です) を保持するoriginalCodonList配列であり、256 個のコドンを含む文字列配列です。マップ内の文字列配列に 4 つのコドンを割り当てる方法をいくつか試しましたが、実際には何もうまくいかないようです。これにより、生成されるエラー スパムが最小になります。コンパイルしたときの出力は次のとおりです。

/usr/include/c++/4.6/map:61:0 からインクルードされたファイル、Genencrypt.cpp:4 から: /usr/include/c++/4.6/bits/stl_map.h: メンバー関数 'std::map< _Key, _Tp, _Compare, >_Alloc>::mapped_type& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const key_type&) >[with _Key = std::basic_string, _Tp = std::basic_string [4]、_Compare = >std::less >、_Alloc = std::allocatorsstd::basic_string、std::basic_string [4]> >、std::map<_Key、_Tp、_Compare、>_Alloc>::mapped_type = std::basic_string [4], std::map<_Key, _Tp, _Compare, >_Alloc>::key_type = std::basic_string]': Genencrypt.cpp:63:25: ここからインスタンス化 /usr/include/ c++/4.6/bits/stl_map.h:453:11: エラー: 'int' から非スカラー型への変換 >'std::map, std::basic_string [4]>::mapped_type {aka >std::basic_string [4]}' が要求されました

もちろん、Googleにコピーすると長すぎると言われます。私は Java の専門家ではなく、C++ よりも Java の方がずっと得意です。

TL;DR: C++ で a を作成したいのですがmap<string, string[]>、それは可能で、どのように行うのですか?

編集: これが私が修正した方法です。codonList を から に変更しmap<string. string[]>map<string, vector<string> >このコードを使用してコドンを追加しました

    for(int i = 0; i < 64; i++){
    codonTable[charList[i]].push_back(originalCodonList[4 * i]);
    codonTable[charList[i]].push_back(originalCodonList[4 * i + 1]);
    codonTable[charList[i]].push_back(originalCodonList[4 * i + 2]);
    codonTable[charList[i]].push_back(originalCodonList[4 * i + 3]);
    std::cout << "Working?" << std::endl;
    }
4

3 に答える 3

10

問題は、標準ライブラリ コンテナーで C スタイルの配列を使用できないことです。これらの配列は、代入可能でコピー構成可能であるなどの特定の要件を満たしていないためです。ただし、std::arrayコンパイル時に配列のサイズがわかっている場合、またはstd::vectorそうでない場合は、コンテナーを使用できます。

#include <map>
#include <array>
#include <vector>

std::map<std::string, std::array<std::string, 4>> m_fixed;
std::map<std::string, std::vector<std::string>> m_dynamic;

std::arrayC++11 の一部であることに注意してください。C++11 をサポートしていない場合はstd::tr1::array<tr1/array>ヘッダーの TR1 バージョンまたは Boost ライブラリ バージョンを使用できます。

于 2012-12-10T07:01:33.543 に答える
1

C++ では、達成しようとしていることはstd::map<std::string, std::vector<std::string> >.

または、実際には複数の文字列値を単一の文字列キーに関連付けているだけなので、std::multimap<std::string, std::string>.

また、キーを順番に反復できることを気にしない場合は、std::unordered_multimap<std::string, std::string>が望ましい場合があることに注意してください (通常、対数ではなく一定の複雑さを期待します)。

于 2012-12-10T07:05:55.667 に答える
0

あなたは実際に別のクラスを探しています。C++にはstd::multimap<Key, Value>。通常のマップとは異なり、multimapキーごとに複数の値を許可します。あなたの場合、文字列キーごとに4つの文字列値を格納できます。

于 2012-12-10T09:22:48.740 に答える