【问题标题】:C++ map<string, vector<char> > accessC++ map<string, vector<char>> > 访问
【发布时间】:2012-02-16 03:33:33
【问题描述】:

我创建了一个如下所示的矢量地图:

map<string, vector<char> > myMap;
string key = "myKey";
vector<char> myVector;
myMap[key] = myVector;

我希望能够将“char”附加到地图中的矢量,但我不知道如何在创建特定键/值(矢量)后访问所述矢量以附加。有什么建议?我正在迭代 char 并且可能会在我去的时候向向量添加很多,所以如果有一个简单的方法来做到这一点会很好。谢谢。


我想在我去的时候附加地图中的矢量。我不需要原始向量...我只需要返回我创建的键/向量的映射(在附加之后),以便我可以将它传递给另一个函数。 map* 中的 * > 有什么作用?那是引用指针吗? (我还没有到那里上课)另外,我需要: myMap[key]->push_back('s'); 要么 myMap[key].push_back('s'); ??

【问题讨论】:

  • 您是否要创建哈希表?
  • 明确一点——你想附加到myVector,还是附加到存储在地图中的那个对象的副本? Mir Milad Hosseiny 的回答好像您想使用地图附加到 myVector,所以要么该答案适用,要么所有其他答案都适用。

标签: c++ stl vector map


【解决方案1】:

追加:

myMap[key].push_back('c');

或者使用myMap.find,但是你必须检查你是否得到了一个end 迭代器。 operator[] 返回对 vector 的引用。

但这会修改​​存储在map 中的vector,而不是原始的,因为您已经使用myMap[key] = myVector;map 中存储了一个副本。如果这不是您想要的,您应该重新考虑您的设计,并可能在地图中存储(智能)指向矢量的指针。

【讨论】:

  • 通过这样做,一个向量的副本被创建并且一个推送到克隆的向量和原始向量是空的。
  • @MirMiladHosseiny:好的,我现在明白你的意思了,但我认为 OP 将使用存储在地图中的矢量而不是原始矢量。
  • 什么....?废话! myMap[key] 是地图中 std::vector&lt;char&gt; 的左值。表达式myMap[key].push_back('c'); 绝对没问题,而且要走的路! (答案+1)。
  • @DietmarKühl:好吧,OP 的问题有点模棱两可。他们想“访问所述向量”,但实际上由于复制而存在两个向量。
  • @larsmans:这就是它在代码示例之后所说的:“我希望能够将'char's'附加到地图中的向量......”对我来说,这不是留下很多歧义。诚然,我不明白原来的问题到底是什么,尽管给出了多个答案缺乏使用参考的事实,我有一个模糊的怀疑。
【解决方案2】:

要访问映射的值,在您的情况下是一个向量,您只需在方括号中提供键,就像您分配值一样。 所以,要附加'a':

myMap[key].push_back('a');

【讨论】:

  • 通过这样做,一个vector的副本被创建,a被推送到克隆的vector,原始vector为空。
  • 没有。 myMap[key] 返回一个引用,因此它会修改地图内的向量。
  • @lionbest - OP 说他想“将 'char's' 附加到地图中的矢量”,所以我相信这是正确的。
【解决方案3】:

如果你知道关键:

string key = "something";
char ch = 'a'; // the character you want to append

map<string, vector<char> >::iterator itr = myMap.find(key);
if(itr != myMap.end())
{
    vector<char> &v = itr->second;
    v.push_back(ch);
}

您也可以使用map::operator[] 访问映射条目,但如果该键不存在,将使用该键创建一个新条目:

vector<char> &v = myMap[key]; // a map entry will be created if key does not exist
v.push_back(ch);

或者简单地说:

myMap[key].push_back(ch);

【讨论】:

  • 必须是vector&lt;char&gt;&amp; v。所以v.push_back(ch) 处理迭代器指向的内容。
  • @Meysam:lionbest 是正确的:如果您坚持使用另一个名称(例如 v)引用 iter-&gt;second,那么您需要引用它:std::vector&lt;char&gt;&amp; v = iter-&gt;second;
  • @Meysam:即使使用下标运算符可能会在不存在时创建新元素,您仍然需要使用引用:否则您将附加到副本。
  • @DietmarKühl:你是对的。我需要使用参考。谢谢
【解决方案4】:

我有一个新建议。您可以使用vector&lt;char&gt;* 而不是vector&lt;char&gt; 来收集map 中的向量指针。更多信息请参见下面的代码:

map<string, vector<char>* > myMap;
string key = "myKey";
vector<char>* myVector = new vector<char>();
myMap[key] = myVector;
myMap[key]->push_back('S');

【讨论】:

  • 除了几乎肯定会造成内存泄漏之外,使用指向std::vector&lt;char&gt; 的指针还有什么优势?
猜你喜欢
  • 1970-01-01
  • 2021-06-18
  • 1970-01-01
  • 2014-11-19
  • 1970-01-01
  • 2014-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多