2012-12-10 35 views
3

我想通過轉換我在java中編寫的一些程序來學習C++。一種是加密程序,它接受文本輸入並使其看起來像DNA(AGCTGTGCT ...)。我可以使用每個4個鹼基的256個密碼子加密64個字符。 (「A」=「TGGC」,「B」=「ATGC」...)在java中,我製作了一個hashmap<String, String[]>,其中的密鑰是要加密的字符,並且該值是4個字符串的數組,其中每個字符串是隨機選擇一個密碼子來代替加密字符。是map <string,string []>可能在C++中嗎?

在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]; 

    } 
} 

是持有64個可編碼字符數組(他們是真正的字符串)和originalCodonList是一個包含了256個密碼子字符串數組。我已經嘗試了幾種方法將4個密碼子分配給地圖中的字符串數組,但似乎沒有任何效果。這會產生最少的錯誤垃圾郵件。下面是我編譯時的輸出:

In file included from /usr/include/c++/4.6/map:61:0, from Genencrypt.cpp:4: /usr/include/c++/4.6/bits/stl_map.h: In member function ‘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::allocatorstd::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: instantiated from here /usr/include/c++/4.6/bits/stl_map.h:453:11: error: conversion from ‘int’ to non-scalar type >‘std::map, std::basic_string [4]>::mapped_type {aka >std::basic_string [4]}’ requested

當然谷歌告訴我,當我把它複製到谷歌時它太長了。我不是java的專家,我在java上比在C++上好得多。

TL; DR:我想在C++中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; 
    } 
+0

我覺得OP是指關於C C++ – Anon

+1

你的標題會談,關於C的問題本身++。它看起來像標題是錯誤的。 – juanchopanza

+0

修正了它,謝謝 – user137

回答

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::array是C++ 11的一部分。如果您沒有C++ 11支持,則可以使用<tr1/array>標題中的TR1版本std::tr1::array或Boost庫版本。

+0

到目前爲止,我使用了矢量實現,因爲它不會用std :: array編譯。謝謝! – user137

1

在C++中,你要完成可以用std::map<std::string, std::vector<std::string> >做什麼。

或者,因爲你真的只是多字符串值與一個字符串鍵關聯,您可以使用std::multimap<std::string, std::string>

另請注意,如果您不關心是否能夠按順序遍歷鍵,則std::unordered_multimap<std::string, std::string>可能更可取(您通常期望常數複雜性而不是對數)。

0

你actaully尋找另一個類。 C++有std::multimap<Key, Value>。與常規地圖不同,multimap允許每個鍵有多個值。在你的情況下,你可以存儲每個字符串鍵4個字符串值。

相關問題