2013-06-11 17 views
5

Tôi đã chương trình sau đây được biên soạn tại biên dịch khác nhau, và nhận được hành vi khác nhau,hành vi khác nhau unordered_multimap trong gnu ++ 11 và C++ 0x

Nguồn:

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

Biên soạn trong g ++ 4.4.6 trong RedHat Linux thích:

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

sẽ nhận được câu trả lời đúng cho myMap và mymultimap, nhưng trong MinGW: http://sourceforge.net/projects/mingwbuilds/?source=dlp

Biên dịch nó như sau:

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

Lần này, myMap vẫn nhận được câu trả lời đúng, nhưng mymultimap đều các MinGW g ++ phiên bản trống rỗng, là

g ++ (REV1, Được xây dựng bởi MinGW- xây dựng dự án) 4.8.1

Tôi rất thú vị trong C++ 11 vì vậy tôi tải xuống trình biên dịch MinGw trong winx, g ++ 4.4.6, trình biên dịch phát triển của tôi, không thể biên dịch C++ 11 để kiểm tra.

Những gì tôi đã bỏ lỡ? mục tiêu của tôi là thử nghiệm C++ 11, Bất kỳ đề xuất được đánh giá cao !!

Edit:

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

Sau khi tôi thay đổi mã của tôi để make_pair, nó hoạt động trong MinGW và in câu trả lời đúng cho mymultimap .... đó là xa lạ với tôi mặc dù ~~

+0

không có thông báo lỗi, OP nói Multimap trống khi sử dụng mã của mình với MinGW –

+0

@barfatchen (1) Với gnu ++ 11 bạn cũng cho phép mở rộng gnu , xem [Sự khác biệt giữa -std = C++ 11 và -std = gnu ++ 11 là gì?] (http://stackoverflow.com/q/10613126/341970) (2) Tại một số điểm trong quy trình chuẩn hóa 'cặp' bị hỏng, tôi không nhớ chi tiết chính xác. Những gì bạn thấy có thể liên quan đến điều đó. Vâng, không ai trong số những điều này giúp bạn nhưng chúng ta hãy hy vọng ai đó có thể trả lời câu hỏi của bạn. – Ali

Trả lời

3

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

Điều này không liên quan trực tiếp đến việc trộn lẫn. Một trường hợp thử nghiệm được biên dịch với g++4.8 có cùng một vấn đề. Tuy nhiên, cùng một trường hợp thử nghiệm được biên dịch với g ++ 4.7.2 trên ideone không có vấn đề này. Đây là một lỗi trong g ++ 4.8 và bạn nên báo cáo nó (hoặc cho tôi biết và tôi sẽ báo cáo nó cho bạn).

gì đang xảy ra:

Các cuộc gọi đến mymap.insert(mypair[0]); đang chuyển động chuỗi ra khỏi std::pair. Vì vậy, khi mymultimap.insert(mypair[0]); được gọi, các chuỗi đã được di chuyển.

Đây là một trường hợp thử nghiệm tối thiểu:

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

Cảm ơn, Nếu bạn có thể báo cáo vấn đề này với trung tâm liên quan, điều đó sẽ được đánh giá cao !! nó là loại của bạn ~~ – barfatchen