15

我有一个字符串数组,里面装满了句子中的单词。

words[0] = "the"
words[1] = "dog"
words[2] = "jumped"
words[3] = "over"
words[4] = "the"
words[5] = "wall."
words[6] = "the"
words[7] = "cat"
words[8] = "fell"
words[9] = "off"
words[10] = "the"
words[10] = "house."

等(愚蠢的例子,但它适用于此)

每个单词都将是一个键,其后面的单词作为它的值。所以“结束”=>“该”。一些键可以有多个值。例如,"the" => "dog" || “墙” || “猫” || “屋”。该值是从该键的值中随机选择的。

当程序运行时,它会随机选择一个单词并造句。所以它可能是这样的:“猫从狗身上掉了下来”。

我尝试实现一个地图(map myMap;),但是每个键只允许一个值(我认为)。

希望我解释得对。

4

7 回答 7

37

std::multimap

该链接提供了一个很好的例子。引用如下:

 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;
}
于 2009-03-30T18:10:18.667 回答
7

如果您使用的是 C++,那么只需创建一个类来表示您的键值对:

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

然后,创建一个映射,将每个键映射到包含其值的对象。

这很简单,可扩展,并且可以用任何 OO 语言完成。

抱歉,我的 C++ 生锈了,所以语法错误,但基本思想很简单。

于 2009-06-15T20:27:34.487 回答
6

您可以使用 STL 中的多图并使用调用

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

获得一系列与您的键匹配的迭代器

我个人觉得这有点笨拙,因为必须处理迭代器范围,而不仅仅是获取代表该键所有值的对象。为了解决这个问题,您还可以将向量存储在常规地图中并将字符串添加到向量中。

于 2009-03-30T19:02:44.937 回答
1

我发现结构可能适用于这种情况。这种方法(基本上类似于类)允许更清晰地访问您认为合适的参数。

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";
    }
}
于 2018-02-08T21:16:40.770 回答
0

正如其他两个人指出的那样,std::multimap可以成为您的解决方案。

还要考虑std::tr1::unordered_multimapVS 2008它似乎有它可用GCC,至少从 version 有它4.3

于 2009-03-30T18:13:07.770 回答
0

您也可以使用unordered_map<char,vector<string>>它对地图结构有一些好处。如果你的字典像'c': "cat", 'c':"car", , 'a':apple,你可以做这样的插入'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
于 2017-09-03T21:17:44.700 回答
0

可以有另一种方法来实现每个键两个值,特别是对于大多数地图元素每个键有两个值的情况。通过配对一个键的两个值,如此链接中所述:

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

在函数中使用它:

#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;
}
于 2017-10-14T05:55:39.963 回答