3

我正在尝试通过转换我用java编写的一些程序来学习C++。一种是加密程序,它接受文本输入并使其看起来像 DNA(AGCTGTGCT...)。我可以使用 4 个碱基的 256 个密码子加密 64 个字符。( "A" = "TGGC", "B" = "ATGC"...) 在 java 中,我做了一个hashmap<String, String[]>,其中密钥是要加密的字符,值是一个由 4 个字符串组成的数组,其中每个字符串是一个随机选择的密码子来替换加密字符。

在 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]}' 请求

当然,当我将它复制到谷歌时,谷歌告诉我它太长了。我不是 java 专家,而且我在 java 方面比在 c++ 方面要好得多。

TL;DR:我想map<string, string[]>用 C++ 做一个,有可能吗?怎么做?

编辑:这是我修复它的方法,我将 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::array是 C++11 的一部分。如果您不支持 C++11,则可以使用标头中的 TR1 版本std::tr1::array<tr1/array>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 回答