C++ map<string, vector<char>> 访问

13

我创建了一个向量地图,看起来像这样:

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

我想能够在map中向vector追加字符,但我不知道如何访问已创建的特定键/值(向量)以便追加。 有什么建议吗?我正在迭代字符,可能会在进行迭代时向向量添加很多内容,因此最好有一种简单的方法来实现它。谢谢。


我希望可以在迭代时将map中的vector追加。 我不需要原始向量...我只需要返回我已创建的键/向量映射(在追加后),以便我可以将其传递给另一个函数。 map* >中的*是什么意思? 这是引用指针吗?(我还没有在讲座中涉及到这个)此外,我需要使用:      myMap[key] - > push_back('s'); 还是      myMap [key] .push_back('s'); ??


你正在尝试创建哈希表吗? - Tamer Shlash
请明确一下 - 您想将内容附加到 myVector 还是存储在映射中的该对象的副本上?Mir Milad Hosseiny 的回答似乎假定您想使用映射来附加到 myVector,因此该回答可能适用,或者其他所有回答都适用。 - Steve Jessop
4个回答

17

进行追加:

myMap[key].push_back('c');
或者使用myMap.find,但是您需要检查是否获得了一个end迭代器。 operator[]返回对vector的引用。
但是这会修改存储在map中的vector而不是原始的vector ,因为您已经使用myMap[key] = myVector;将其存储为副本。如果这不是您想要的,您应该重新考虑设计,并可能在映射中存储(智能)指向向量的指针。

1
通过这样做,创建了一个向量的副本,并将其推送到克隆向量中,原始向量则为空。 - Mir Milad Hosseiny
@MirMiladHosseiny:好的,我现在明白你的意思了,但是我假设 OP 会使用存储在映射中的向量而不是原始向量。 - Fred Foo
什么鬼?胡说八道!myMap[key]是映射中std::vector<char>的左值。表达式myMap[key].push_back('c');绝对没问题,也是正确的方法!(点赞+1)。 - Dietmar Kühl
@DietmarKühl:嗯,OP的问题有点含糊不清。他们想要“访问所述向量”,但由于复制,实际上有两个向量。 - Fred Foo
@larsmans:这是在代码示例之后所说的: “我想能够将'char'附加到地图中的向量中...” 对我来说,这没有留下太多歧义。不可否认,无论如何,我也不看出原始问题到底是什么,尽管有多个答案缺乏对参考的使用,我有一种模糊的怀疑。 - Dietmar Kühl

6

假设您已经知道了密钥:

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<char>& v。这样 v.push_back(ch) 才能在指向的迭代器上工作。 - Arpegius
@Meysam:lionbest是对的:如果你坚持用另一个名称(例如v)引用iter->second,那么你需要引用它:std::vector<char>& v = iter->second; - Dietmar Kühl
@Meysam:即使使用下标运算符可能会在它们不存在时创建新元素,你仍然需要使用引用:否则你将附加到一个副本。 - Dietmar Kühl
@DietmarKühl:你说得对。我需要使用一个引用。谢谢。 - B Faley

1

要访问映射值,也就是您的情况下的向量,只需像分配值时一样在方括号中提供键即可。 因此,要追加 'a':

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

通过这样做,创建了向量的副本,并将 a 推入克隆向量中,原始向量为空。 - Mir Milad Hosseiny
不。myMap[key]返回一个引用,因此它会修改映射内部的向量。 - Arpegius
@lionbest - OP说他想要“将'char'附加到地图中的向量”,所以我认为这是正确的。 - Michael Chinen

0
我有一个新的建议。您可以使用vector<char>*而不是vector<char>来收集指向向量的指针在您的map中。有关更多信息,请参见下面的代码:
map<string, vector<char>* > myMap;
string key = "myKey";
vector<char>* myVector = new vector<char>();
myMap[key] = myVector;
myMap[key]->push_back('S');

3
使用指向std::vector<char>的指针会有什么优势,除了几乎肯定会导致内存泄漏? - Dietmar Kühl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接