Làm thế nào để một vectơ như là một khóa hoạt động nội bộ trong C ++?


14

Câu trả lời SO này nói rằng Bản đồ STL với Vector cho Khóa , vectơ có thể được sử dụng làm khóa. Vì vậy, khi chúng ta sử dụng một vector làm chìa khóa. Làm thế nào mà nó thực sự hoạt động vì khóa cần phải là duy nhất vì vậy khi chúng ta chèn một vectơ khác có cùng các phần tử, việc mapkiểm tra phần tử trùng lặp theo phần tử hay tên của vectơ sẽ chỉ định điều gì? Giống như tên của mảng đại diện cho địa chỉ cơ sở. Vì vậy, một mảng có thể được sử dụng làm khóa vì địa chỉ cơ sở có thể được sử dụng làm khóa trong trường hợp này nhưng khóa là gì trong trường hợp của vectơ. Làm thế nào nó hoạt động nội bộ.

Bởi vì khi tôi in tên của vectơ, tôi gặp lỗi

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

Bạn có ý nghĩa gì bằng cách in tên vector?
Bart

has operators == and <Làm thế nào để giúp đỡ? Câu hỏi của tôi là kiểm tra các phần tử trùng lặp sẽ ánh xạ so sánh phần tử khóa vectơ theo phần tử
Pulkit Bhatnagar

3
@PulkitBhatnagar Nhưng ... Sẽ không ai bắt bạn phải sử dụng std::vectorlàm chìa khóa cho std::map. Bạn trả tiền cho những gì bạn sử dụng . Nó có thể được thực hiện và có thể có một số trường hợp sử dụng cho điều đó, nhưng chắc chắn nhất là bạn có thể thay đổi cấu trúc dữ liệu của mình. Các thùng chứa STL được thiết kế linh hoạt tối đa và có thể sử dụng theo bất kỳ cách nào người dùng có thể muốn sử dụng chúng.
Yksisarvinen


1
@PulkitBhatnagar Cửa hàng trực tiếp. std::mapsẽ sao chép cả khóa và giá trị vào chính nó. std::unordered_mapcó thể lưu trữ băm của khóa.
Yksisarvinen

Câu trả lời:


9

Có một toán tử quá tải <cho mẫu lớp std :: vector.

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

đó là dựa trên thuật toán tiêu chuẩn std::lexicographical_compare.

Đây là một chương trình trình diễn.

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

Đầu ra của nó là

true
true
true
true
true
true

Vì vậy, lớp có thể được sử dụng như là một chìa khóa trong bản đồ.

Theo mặc định, bản đồ mẫu lớp sử dụng đối tượng hàm std :: less mà lần lượt sử dụng toán tử <

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

Tuy nhiên, không có toán tử quá tải << cho mẫu lớp std :: vector.


5
Tôi thấy câu trả lời của bạn gần đây trong hầu hết tất cả các câu hỏi về C ++ trên SO, tôi không biết liệu trong cả đời tôi có thể đạt được những gì bạn có hay không nhưng tôi sẽ cố gắng hết sức. Cảm ơn câu trả lời
Pulkit Bhatnagar

8

Tên của một đối tượng và nội dung của đối tượng đó luôn là những thứ không liên quan.

operator ==cho std::vectorđầu tiên sẽ so sánh chiều dài của vectơ và sau đó mỗi người trong số các yếu tố của nó sử dụng operator ==là tốt.

operator <so sánh các phần tử trong vectơ theo từ vựng, tức là nó trả về x[i] < y[i]phần tử không bằng nhau đầu tiên trong vectơ xy.

Đây là những yêu cầu std::mapđối với một loại được sử dụng như Key. Vì std::vectorthỏa mãn cả hai, nó có thể được sử dụng bởi Key. Lưu ý rằng loại được quản lý bởi vectơ cũng phải làm cho các toán tử này bị quá tải để hoạt động này (vì std::vectorphụ thuộc vào các toán tử đó để thực hiện các toán tử riêng của nó).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.