преобразовать карту Perl с несколькими ключами в C ++ - PullRequest
2 голосов
/ 15 марта 2010

Я хочу преобразовать код из Perl в C ++, и моя проблема заключается в многоключевом отображении в Perl! Пример:

Perl:

$address{name}{familyName} = $someAddress;

и ключи не являются уникальными. Я хочу подобную структуру данных в C ++, используя карту или ...!? также я хочу искать и получать значения с первым ключом, например, я хочу такие% keys {name} в c ++.

отредактировано: я хочу знать что-то вроде того, существует ли какая-либо фамилия для специального имени или нет, также имя и фамилия вместе являются ключевыми и уникальными, не каждый из них.

Ответы [ 3 ]

6 голосов
/ 15 марта 2010

Эквивалент %keys{name} делается с std::map. Вы можете использовать оператор скобок для доступа к элементам карты. И он удобно вставляет новый созданный по умолчанию объект, если вы запрашиваете ключ, которого еще нет. Возможно, вам удастся продублировать многоключевую карту с картой, например, std::map<std::string, std::map<std::string, std::string> >.

Если с вашими ключами может быть связано более одного значения, используйте std::multimap вместо map.

4 голосов
/ 15 марта 2010

Вы хотите что-то вроде:

#include <map>
#include <string>

struct Person {
   Person( const std::string & n, const std::string & f ) 
        : name( n ), family( f ) {} 

   bool operator<( const Person & p ) const {
      if ( family < p.family ) return true;
      else if ( family == p.family ) return name < p.name;
      else return false;
   }

   std::string name;
   std::string family;

};

int main() {
    std::multimap <Person, std::string> amap;
    amap.insert( 
      std::make_pair( Person( "fred", "bloggs" ), "somewhere") 
    );
    // alternate, though semantically somewhat different syntax
    amap[ Person( "fred", "bloggs" ) ] = "new address";
}    
3 голосов
/ 15 марта 2010

Если ключи не уникальны, вы должны использовать std::multimap, а не std::map. Уникальность клавиш как раз и заключается в разнице между этими двумя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...