2013-06-11 9 views
5

Ho il seguente programma compilato a diversi compilatore, e ottenere un comportamento diverso,comportamento diverso unordered_multimap in GNU ++ C++ 0x 11 e

Fonte:

#include <iostream> 
#include <sstream> 
#include <unordered_map> 

using namespace std ; 

std::unordered_map<std::string,std::string> mymap; 
std::unordered_multimap<std::string,std::string> mymultimap; 
int main() 
{ 
    DoAddItem() ; 

    std::cout << "mymap contains:"; 
    for (auto it = mymap.begin(); it != mymap.end(); ++it) 
     std::cout << " " << it->first << ":" << it->second; 
    std::cout << std::endl; 

    std::cout << "============================================" << std::endl ; 
    std::cout << "mymultimap contains:"; 
    for (auto it2 = mymultimap.begin(); it2 != mymultimap.end(); ++it2) 
     std::cout << " " << it2->first << ":" << it2->second; 
    std::cout << std::endl; 
    return 0; 
} 

void DoAddItem() 
{ 
    std::pair<std::string,std::string> mypair[100]; 
    int idx ; 
    std::string s1 ; 
    std::string s2 ; 
    for(idx=0;idx<10;idx++) 
    { 
     s1 = string("key") + int2str(idx) ; 
     s2 = string("val") + int2str(idx) ; 
     mypair[idx] = {s1,s2} ; 
     mymap.insert(mypair[idx]) ; 
     mymultimap.insert(mypair[idx]) ; 
    }//for 
    return ; 
} 

Compilato in g ++ 4.4.6 in RedHat Linux piace:

g++ --std=c++0x unordered_map1.cpp -o unordered_map1.exe 

otterrà la risposta giusta per mymap e mymultimap, ma in MinGW: http://sourceforge.net/projects/mingwbuilds/?source=dlp

compilarlo come il seguente:

g++ -std=gnu++11 unordered_map1.cpp -o unordered_map1.exe 

Questa volta, mymap ancora ottenere la risposta giusta, ma mymultimap sono tutti la MinGW g versione vuota, ++ è

g ++ (rev1, Costruito da MinGW- builds project) 4.8.1

Sono interessante in C++ 11 quindi scaricare il compilatore MinGw nella mia winx, g ++ 4.4.6, il mio compilatore di sviluppo, non è in grado di compilare C++ 11 per il test.

Cosa mi sono perso? il mio obiettivo è testare C++ 11, ogni suggerimento è apprezzato !!

Edit:

mymultimap.insert(mypair[idx]) ; //won't work !! 
mymultimap.insert(make_pair(s1,s2)) ; //This work !! 

Dopo cambio il mio codice per make_pair, funziona in MinGW e stampare la risposta giusta per mymultimap .... che è strano per me anche se ~~

+0

non c'è alcun messaggio di errore, OP afferma multimappa è vuoto quando si utilizza il suo codice con MinGW –

+0

@barfatchen (1) con GNU ++ 11 si attiva anche estensioni GNU , vedi [Quali sono le differenze tra -std = C++ 11 e -std = gnu ++ 11?] (http://stackoverflow.com/q/10613126/341970) (2) Ad un certo punto durante la procedura di standardizzazione 'pair' era rotto, non ricordo i dettagli esatti. Ciò che vedi potrebbe essere collegato a questo. Bene, nessuna di queste cose ti aiuta ma speriamo che qualcuno possa rispondere alla tua domanda. – Ali

risposta

3

BUG FILEDhttp://gcc.gnu.org/bugzilla/show_bug.cgi?id=57619

Questo non è direttamente correlato a mingw. Un test case compilato con g++4.8 ha lo stesso problema. Tuttavia, lo stesso caso di test compilato con g ++ 4.7.2 su ideone non ha questo problema. Questo è un bug in g ++ 4.8 e dovresti segnalarlo (o fammi sapere e te lo segnalerò per te).

ciò che sta accadendo:

La chiamata a mymap.insert(mypair[0]); si sta muovendo la corda fuori dal std::pair. Quindi, quando viene chiamato mymultimap.insert(mypair[0]);, le stringhe sono già state spostate.

Ecco un caso minima della prova:

std::unordered_map<std::string,std::string> mymap; 
std::unordered_multimap<std::string,std::string> mymultimap; 
int main() 
{ 
    std::pair<std::string,std::string> mypair[1]; 
    std::string s1 = std::string("key"); 
    std::string s2 = std::string("val"); 
    mypair[0] = {s1,s2}; 
    mymap.insert(mypair[0]); 
    mymultimap.insert(mypair[0]); 
    std::cout << "mymultimap contains:"; 
    for (auto it2 = mymultimap.begin(); it2 != mymultimap.end(); ++it2) 
     std::cout << " " << it2->first << ":" << it2->second; 
} 
+0

Grazie, se potessi segnalare questo problema al centro correlato, sarebbe molto apprezzato !! è gentile da parte tua ~~ – barfatchen

Problemi correlati