Anahtar olarak bir vektör C ++ içinde dahili olarak nasıl çalışır?


14

Bu SO cevapları Anahtar için Vector ile STL Haritasının vektörün anahtar olarak kullanılabileceğini söylüyor. Yani bir vektörü anahtar olarak kullandığımızda. Anahtarın benzersiz olması gerektiğinden, bu gerçekten nasıl çalışır, bu yüzden aynı öğelerle başka bir vektör eklediğimizde, mapöğeye göre yinelenen öğe olup olmadığını kontrol edecek veya vektörün adı bir şey belirleyecek mi? Dizinin adı temel adresi temsil eder. Bu nedenle, bir dizi anahtar adres olarak kullanılabilir çünkü taban adresi bu durumda bir anahtar olarak kullanılabilir, ancak bir vektör durumunda anahtar nedir. Dahili olarak nasıl çalışır?

Çünkü vektörün adını yazdırdığımda bir hata alıyorum

vector<int> v;
cout<<v; //error

Vektör adını yazdırarak ne demek istiyorsun?
Bart

has operators == and <bu nasıl yardımcı olur? benim sorum yinelenen öğeleri vektör anahtar öğesi öğeye göre karşılaştırmak kontrol etmek oldu
Pulkit Bhatnagar

3
@PulkitBhatnagar Ama ... Hiç kimse sizi std::vectoranahtar olarak kullanmaya zorlamayacak std::map. Kullandığınız kadar ödersiniz . Bu yapılabilir ve belki bunun için bazı kullanım durumları vardır, ancak kesinlikle seçtiğiniz veri yapınızı değiştirebilirsiniz. STL kapları, maksimum derecede çok yönlü olacak ve kullanıcının bunları kullanmak isteyebileceği her şekilde kullanılabilecek şekilde tasarlanmıştır.
Yksisarvinen


1
@PulkitBhatnagar Mağazalar doğrudan. std::maphem anahtarı hem de değeri kendi içine kopyalar. std::unordered_mapanahtar karmasını saklayabilir.
Yksisarvinen

Yanıtlar:


9

Std :: vector sınıf şablonu için aşırı yüklenmiş bir işleç var.

template <class T, 
class Allocator>
bool operator< (const vector<T, Allocator>& x, const vector<T, Allocator>& y);

standart algoritmayı temel alır std::lexicographical_compare.

İşte örnek bir program.

#include <iostream>
#include <iomanip>
#include <vector>
#include <iterator>
#include <algorithm>

int main() 
{
    std::vector<int> v1 = { 1, 2 };
    std::vector<int> v2 = { 1, 2, 3 };
    std::vector<int> v3 = { 2 };

    std::cout << std::boolalpha << ( v1 < v2 ) << '\n';
    std::cout << std::lexicographical_compare( std::begin( v1 ), std::end( v1 ),
                                               std::begin( v2 ), std::end( v2 ) )
             << '\n';                                              

    std::cout << std::boolalpha << ( v1 < v3 ) << '\n';
    std::cout << std::lexicographical_compare( std::begin( v1 ), std::end( v1 ),
                                               std::begin( v3 ), std::end( v3 ) )
             << '\n';                                              

    std::cout << std::boolalpha << ( v2 < v3 ) << '\n';
    std::cout << std::lexicographical_compare( std::begin( v2 ), std::end( v2 ),
                                               std::begin( v3 ), std::end( v3 ) )
             << '\n';                                              

    return 0;
}

Çıkışı

true
true
true
true
true
true

Böylece sınıf haritada bir anahtar olarak kullanılabilir.

Varsayılan olarak sınıf şablonu eşlemesi std :: less işlev nesnesini kullanır ve bu da <

template <class Key, class T, class Compare = less<Key>,
class Allocator = allocator<pair<const Key, T>>>
class map 
{
    //...
};

Ancak std :: vector sınıf şablonu için aşırı yüklenmiş bir operatör << yoktur.


5
Yakın zamanda cevaplarınızı SO ile ilgili hemen hemen tüm C ++ sorularında görüyorum, tüm hayatım boyunca sahip olduklarınızı elde edip edemeyeceğimi bilmiyorum ama elimden geleni yapacağım. Cevabınız için teşekkürler
Pulkit Bhatnagar

8

Bir nesnenin adı ve o nesnenin içeriği her zaman ilgisiz şeylerdir.

operator ==çünkü std::vectorönce vektörlerin uzunluğunu ve sonra her bir elemanını kullanarakoperator == .

operator <vektördeki elemanları sözlükbilimsel olarak karşılaştırır, yani x[i] < y[i]vektörlerdeki ilk eşit olmayan eleman için döner xvey .

Bu şartlar şunlardır std::mapolarak kullanılan bir tür için vardırKey . Yana std::vectorhem tatmin, o kadar tarafından kullanılabilir Key. Vektör tarafından yönetilen türün, bu işleçlerin de çalışması için aşırı yüklenmiş olması gerektiğini unutmayın (çünkü std::vectorbu işleçlerin kendi işleçlerini uygulamalarına dayanır).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.