2009-03-30 25 views
6

Tôi có một mảng chuỗi chứa đầy các từ trong một câu.Tôi cần có khóa có nhiều giá trị. Bạn muốn giới thiệu cơ sở hạ tầng nào?

từ [0] = "the"
từ [1] = "chó"
từ [2] = "nhảy"
từ [3] = "qua"
từ [4] = " "
từ [5] =" tường ".
từ [6] = "the"
từ [7] = "mèo"
lời [8] = "rơi"
lời [9] = "off"
lời [10] = "the"
từ [10] = "nhà".
vv (Ví dụ ngu ngốc, nhưng nó hoạt động cho việc này)

Mỗi từ sẽ là một khóa với từ sau đây là giá trị của từ đó. vì vậy "over" => "the". Một số khóa có thể có nhiều giá trị. Ví dụ: "the" => "dog" || "wall" || "mèo" || "nhà ở". Giá trị được chọn ngẫu nhiên từ những giá trị cho khóa đó.

Khi chương trình chạy nó chọn một từ ngẫu nhiên và tạo một câu. Vì vậy, nó có thể là một cái gì đó như: "con mèo rơi ra khỏi con chó".

Tôi đã thử triển khai bản đồ (bản đồ myMap;) nhưng điều này chỉ cho phép một giá trị cho mỗi khóa (tôi nghĩ).

Hy vọng tôi đã giải thích quyền này.

Trả lời

4

bạn có thể sử dụng một Multimap từ STL và sử dụng các cuộc gọi

pair<iterator, iterator> equal_range(const key_type& k) 

để có được một loạt các vòng lặp phù hợp với chìa khóa của bạn

cá nhân tôi tìm thấy điều này hơi phiền phức do phải đối phó với iterator phạm vi thay vì chỉ nhận được một đối tượng trở lại đại diện cho tất cả các giá trị cho khóa đó. để có được xung quanh mà bạn cũng có thể lưu trữ một vector trong một bản đồ thông thường và thêm các chuỗi của bạn vào vectơ.

24

std::multimap

Liên kết cung cấp một ví dụ tuyệt vời. Được trích dẫn bên dưới:

int main() 
{ 
    multimap<const char*, int, ltstr> m; 

    m.insert(pair<const char* const, int>("a", 1)); 
    m.insert(pair<const char* const, int>("c", 2)); 
    m.insert(pair<const char* const, int>("b", 3)); 
    m.insert(pair<const char* const, int>("b", 4)); 
    m.insert(pair<const char* const, int>("a", 5)); 
    m.insert(pair<const char* const, int>("b", 6)); 

    cout << "Number of elements with key a: " << m.count("a") << endl; 
    cout << "Number of elements with key b: " << m.count("b") << endl; 
    cout << "Number of elements with key c: " << m.count("c") << endl; 

    cout << "Elements in m: " << endl; 
    for (multimap<const char*, int, ltstr>::iterator it = m.begin(); 
     it != m.end(); 
     ++it) 
    cout << " [" << (*it).first << ", " << (*it).second << "]" << endl; 
} 
+0

Cảm ơn bạn đã trả lời nhanh. Khi sử dụng bản đồ, tôi có thể truy cập các giá trị bằng cách sử dụng bản đồ [key]. Làm thế nào tôi có thể nhận được các giá trị bằng cách sử dụng một multimap? –

+1

@Haawk: multimap có một phương thức được gọi là equal_range() sẽ trả về một cặp trình lặp cho biết phạm vi của các phần tử bằng một khóa đã cho. –

0

Như hai người khác đã chỉ ra, std :: multimap có thể là giải pháp của bạn.

Đồng thời xem xét std::tr1::unordered_multimap. Nó có sẵn trong VS 2008 dường như có nó, GCC có nó ít nhất là từ phiên bản 4.3.

4

Nếu bạn đang sử dụng C++ sau đó chỉ cần tạo ra một lớp đại diện cho cặp khóa-giá trị của bạn:

Class foo { 
    key : String 
    values : list of values 
} 

Sau đó, tạo một bản đồ mà các bản đồ mỗi chìa khóa để một đối tượng chứa giá trị của nó.

Điều này rất đơn giản, có thể mở rộng và có thể được thực hiện bằng bất kỳ ngôn ngữ OO nào.

Xin lỗi, C++ của tôi đã bị hỏng nên cú pháp là sai, nhưng ý tưởng thiết yếu thì đơn giản.

0

Bạn cũng có thể sử dụng unordered_map> có một số lợi ích trên cấu trúc bản đồ. Bạn có thể làm chèn như vậy nếu từ điển của bạn cũng giống như 'c': "mèo", 'c': "xe hơi", 'a': táo, 'a': "Angus":

unordered_map<char, vector<string>> char_to_strings_map; 
//loop to traverse the dictionary : key:c, value:s 
    char_to_strings_map[c].emplace_back(s); 
//loop ends 
0

Có thể có một phương pháp thay thế để đạt được hai giá trị cho mỗi khóa, đặc biệt là đối với các trường hợp khi hầu hết các phần tử bản đồ có hai giá trị cho mỗi khóa. Bằng cách ghép nối hai giá trị cho khóa, như đã đề cập trong link này:

std::map<std::string, std::pair<std::int, int> > myMap2 

sử dụng nó trong các chức năng như:

#include<iostream> 
#include<map> 
#include<iterator> 
using namespace std; 
int main(){ 
map<string,pair<int,int>>mp; 
mp.insert(pair<string,pair<int,int>>("ab",make_pair(50,7))); 
mp.insert(pair<string,pair<int,int>>("cd",make_pair(51,8))); 
map<string,pair<int,int>>::iterator it; 
for(it=mp.begin();it!=mp.end();it++) 
    cout<<it->first<<" "<<it->second.first<<" "<<it->second.second<<" "; 
return 0; 
} 
0

Tôi đã phát hiện ra rằng một cấu trúc có thể làm việc tốt cho tình trạng này. Cách tiếp cận này (về cơ bản giống như một lớp) cho phép truy cập sạch hơn vào các tham số của bạn có tên như bạn thấy phù hợp.

struct car_parts { 

    string wheelType; 
    string engine; 
    int number_of_cylinders; 

    car_parts(string _wheelType, string _engine, int _number_of_cylinders) 
    { 
     wheelType = _wheelType; 
     engine = _engine; 
     number_of_cylinders = _number_of_cylinders; 
    } 
}; 

int main() 
{ 
    // Populate the dictionary 
    map<char, car_parts> vehicles = 
    { 
     { 'I', car_parts("All terrain", "X2", 6) }, 
     { 'C', car_parts("Summer only", "BB", 8) }, 
     { 'U', car_parts("All terrain", "X3", 4) } 
    }; 

    map<char, car_parts>::iterator it; 

    it = vehicles.find('I'); 

    if (it != vehicles.end()) 
    { 
     cout << "The vehicle with key of I has " << it->second.number_of_cylinders << " cylinders\n"; 
    } 
} 
Các vấn đề liên quan