2012-12-10 4 views
3

나는 자바로 쓴 몇몇 프로그램을 변환하여 C++을 배우려고한다. 하나는 텍스트 입력을 받아서 DNA처럼 보이도록 만드는 암호화 프로그램입니다 (AGCTGTGCT ...). 나는 각각 4 개의 기본 256 코돈을 사용하여 64 문자를 암호화 할 수있다. ("A"= "TGGC", "B"= "ATGC"...) java에서 나는 키가 암호화 될 문자이고 값이 각각 4 개 문자열의 배열 인 hashmap<String, String[]>을 만듭니다. 암호화 된 문자를 무작위로 선택하는 코돈.은 C++에서 map <string, string []>이 가능합니까?

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 개 encodable 문자를 보유하고 배열 (그들은 정말 문자열)과 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

물론 Google은 내가 Google에 복사 할 때 너무 길다는 것을 알려줍니다. 나는 자바의 전문가가 아니며, 나는 C++보다 자바가 훨씬 낫다.

TL : DR : 나는 map<string, string[]>을 C++로 만들고 싶습니다. 어떻게 할 수 있습니까?

편집 : 나는 그것을 해결 방법은 다음이고, 나는 map<string, vector<string> >map<string. string[]>에서 codonList을 변경하고 코돈

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++을 의미한다고 생각한다. – Anon

+1

당신의 제목은 C와 C에 관한 질문 자체에 대해 이야기한다. 제목이 잘못된 것 같습니다. – juanchopanza

+0

고쳐 주신 덕분에 – user137

답변

10

문제는 당신이 표준 라이브러리 컨테이너 C 스타일 배열을 사용할 수 없다는 것입니다을 추가하려면이 코드를 사용 왜냐하면 그들은 할당 가능하고 복사가 가능하다는 것과 같은 특정 요구 사항을 충족시키지 않기 때문입니다. 당신이 컴파일시에 배열의 크기를 알고, 또는 경우, 당신은 std::array 컨테이너를 사용할 수있는 std::vector없는 경우 : std::array는 C++ (11)의 일부입니다

#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; 

하는 것으로. C++ 11 지원이 없다면 <tr1/array> 헤더 또는 부스트 라이브러리 버전의 std::tr1::array TR1 버전을 사용할 수 있습니다.

+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

다른 수업을 적극적으로 찾고 있습니다. C++은 std::multimap<Key, Value>입니다. 일반지도와 달리 multimap은 키당 여러 값을 허용합니다. 귀하의 경우, 문자열 키당 4 개의 문자열 값을 저장할 수 있습니다.

관련 문제