2010-09-28 19 views
7

Ben aşağıdaki gibi çiftleri bir çift dize bir harita ilan ediyorum:Başka bir std :: çifti içinde bir çift std :: çifti nasıl eklenir?

std::map<std::wstring, 
     std::pair<std::pair<long, long>, 
        std::pair<long, long>>> reference; 

Ve olarak başlatılamıyor: Ancak

reference.insert(L"First", 
       std::pair<std::pair<long, long>, 
          std::pair<long, long>>(std::pair<long, long>(-1, -1), 
          std::pair<long, long>(0, 0))); 

, Visual C++ Hayır "C2664, bana hata veriyor kurucu kaynak türünü alabilir veya kurucu aşırı yük çözünürlüğü belirsiz ".

Şablonları ve STL'yi kullanıyorum ve yanlış yaptığımı söyleyemiyorum.

+4

o okunaklı hale getirmek için typedef en ve 'std :: make_pair' kullanın. – GManNickG

+0

Gözlerinizde * bit * daha kolay hale getirmek için yeniden biçimlendirdim. – egrunin

+0

Tüm bu 'std :: pair'leri yerleştirmek yerine' std :: tr1 :: tuple' işlevini kullanmaya başlayamadınız mı? Boost da bir tuple uygulamasına sahiptir. – Praetorian

cevap

16

>>> doğru şekilde ayrıştırılamıyor (bir C++ 0x derleyiciniz olmadıkça).

Değişim > > >

Bu:

reference.insert("First", 

olmalı:

std::pair<std::pair<long, long>, std::pair<long, long>>(std::pair<long, long>(-1, -1), std::pair<long, long>(0, 0)) 
:

reference.insert(L"First", 
       ^^^ 

Ayrıca daha kolay çiftleri inşaatını yapmak için bir yardımcı program işlevi vardır

olabilir:

std::make_pair(std::make_pair(-1L,-1L),std::make_pair(0L,0L)) 

bu deneyin: şablonu kapattığınızda

reference[L"First"] 
    = std::make_pair(std::make_pair(-1L,-1L),std::make_pair(0L,0L)); 
+0

Yardım için teşekkürler.Soruyu, "ayrıştırmak" ın daha kolay olmasını sağlamak için W "lüğüme" L "harfi eklemek için düzenledim. –

+1

Benimkinden daha iyi bir yanıt, ancak 'referans [anahtar] = değer' ile eklenmenin, reference.insert (make_pair (anahtar, değer)) 'ye farklı davranışlar verebileceğini unutmayın; '[] 'i kullanarak, varolan bir öğenin üzerine yazacaksınız; –

2

C++ ">" ardışık tarafından karışır o vardiya operatörü olarak yorumladığı olarak.

kapanış şablonları, değişim >>> arasında boşluk ekle>>> kendisi tek std::pair argüman yerine iki bağımsız değişkeni alır

+0

Ayrıca, GMan'ın tavsiyesi. – iniju

2

map::insert.

reference.insert(std::make_pair("First", 
           std::make_pair(std::make_pair(-1L,-1L), 
               std::make_pair(0L,0L)))); 
0

O bu tür bir şey ayıklarken typedefs kullanmak için yardımcı olur: Sen gibi bir şey almak için, (işlev argümanları şablon argümanları infers olan) std::make_pair kullanarak kod çeki düzen olabilir.

// test1.cpp : Defines the entry point for the console application. 
// 

#include "stdafx.h" 

#include <map> 
#include <string> 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    typedef std::pair<long, long> ElementType; 
    typedef std::pair<ElementType, ElementType> ValueType; 
    typedef std::wstring KeyType; 
    std::map<KeyType, ValueType> reference; 

    KeyType key = L"First"; 
    reference[key] = ValueType(ElementType(-1, -1), ElementType(0, 0)); 

    return 0; 
} 
+0

Bu tür 'insert()' işlevi, OP'yi kullanmayı denediğinden (#'seçeneğini kullanmanız durumunda) yoktur. Gönderdiğiniz örnek kod çalışır ve oldukça okunabilir, ancak 'insert()' yerine değiştirdiğinizden dolayı, include gibi görünmüyor ... – sth

+0

"Yalnızca" "bölümüne ihtiyacınız varsa, sanırım biraz yanıltıcı, ben düşünürdüm * bu * yardımcı olur ve bunu kabul ederdim. – sth

+0

Tamam, anladın. Cevabınızdaki "kodun okunması için daha kolay bir kod eklemek için" operatör [] yazdığınızı anlıyor musunuz bilmiyorum. Söylediğiniz gibi, ekleme mevcut değil! – ttt

0

Sen çiftleri çiftleri oluşturmak için bir yardımcı işlevi oluşturarak kodunuzu basitleştirmek olabilir, standart kütüphanesinde mevcuttur std::make_pair yardımcı işlevine analog. Ayrıca kodu daha kolay okunmasını ekleme sonuçları için haritalar operator[] kullanarak:

template<typename T, typename U, typename V, typename W> 
std::pair< std::pair<T,U>, std::pair<V,W> > make_pair_pair(T t, U u, V v, W w) { 
    // using std::make_pair instead of the constructor for better readability 
    return std::make_pair(std::make_pair(t, u), std::make_pair(v, w)); 
} 

reference[L"First"] = make_pair_pair(1,2,3,4); 
İlgili konular