2015-03-14 14 views
6

C++ 'daki sözcükler için bir çeşit arama yapıyorum ve bir haritayı uygulamak için kod varken, bir harita kullanarak çalışıp çalışmadığından emin olmak istiyorum std :: string olarak anahtarlar ve değerlerle ve yalnızca geri dönüş değeri olmayan aramalar olarak anahtarları kullanır.C++ ile bir değer kullanmayan bir harita kullanarak sözlük, sadece tuşlar

std::vector< std::string> DictionLines; 
    Reader DictionReader(Dictionary); 
    DictionLines = DictionReader.getLines(); 
    std::map<std::string, std::string> DictionaryM; 

    for (int t = 0; t < DictionLines.size(); ++t) { 
     DictionaryM.insert(std::pair<std::string, std::string>(DictionLines.at(t), DictionLines.at(t))); 
    } 

Bu kod, 349900 sözcüğü bir Dictionary.txt dosyasında alır ve bunları haritaya kaydeder. Sözlüğün her satırı, yalnızca aranacak sözcüktür; hiçbir tanım veya ilişkilendirilecek herhangi bir değer yoktur. Bu yüzden haritadaki aynı anahtar ve değer çiftini saklamanın iyi olduğunu ve bulup ilk/saniye kullanmanın da iyi olacağını düşünüyorum. Lütfen onaylayın.

+3

Std :: set right hakkında bilgi sahibi misiniz? – Ludwik

cevap

12

std::set istediğiniz gibi görünüyor. Sadece anahtarların önem verdiği ve değeri hiç umursamadığınız veya kullanmadığınız bir harita gibidir. Belirli bir önek sonra bir kelime, bir std::set<std::string> olarak temsil sözlükten bakmak lower_bound

Sen C++ containers standart haline daha bakmak gerekir düşünün. Bu kadar fazla seçenek yok ve bir şekilde hepsini tanımalı (ve iş için doğru konteynerleri seçmeli veya birleştirmelisiniz)

+0

Diğer bir deyişle, ** değerleri ** tuşlarıdır. – Ludwik

+0

Biliyorum bunu bir cevap olarak işaretledim ama tekrar plz yardım et. Belirli bir anahtar için arama yaparken hız O (log n) nedeniyle ağaç yapısını aradım. Ancak, şimdi bunu bir sonraki adımın bir seti ve düşüncesi olarak uyguladığımdan, özellikle anahtarları aramamın farkına varıyorum; "Anahtar" ile aynı uzunluğa sahip kelimeler için sözlüğe bakıyorum. Böyle bir sette doğrusal olarak yinelemem, sonuçta O (n) zamana dönmez mi? Bu, uyguladığım bir çeşit Yazım Denetimi. – Kthieu

+1

@Kthieu Tuşların uzunluklarının olduğu bir harita istediğiniz gibi ve değerler o uzunluktaki kelimelerle (basit bir liste olabilir, bir harita olabilir) veya sadece bir "std :: multimap" olabilir. Ayrıca, arama için * O (log n) * yazdığınızın * yavaş * olduğunu, hızlı olmadığını unutmayın. Düzenlenmemiş haritalar ve kümeler (karma tablolarla uygulanır ve sık sık hash veya hashmaps olarak adlandırılır, C++ 'std :: unordered_set' ve' std :: unordered_map') * O (n) * arama ve (amortize) ekleme süreleri elde eder. TL; DR Bu cevapta da söylendiği gibi konteynerlerinizi tanıyın! – hyde

İlgili konular