将向量元素上的指针传递到地图中
Passing pointer on vector's elements into map
以下函数必须通过他的全名和生日在向量 allSportsmen 中找到一个运动员,然后通过它的名字找到一些运动并将这个运动员和这个运动从向量添加到映射参与者,其中键是运动员和值他做的运动是什么
vector<Sportsman> allSportsmen;
vector<Sport> allSports;
map<Sportsman, vector<Sport>> participants;
void addSportToSportsman(string fullName, string birthDate, string sportName) {
Sportsman* s;
Sport* sport;
for (auto x = allSportsmen.begin(); x != allSportsmen.end(); x++) {
if (x->getFullName() == fullName && x->getBirthDate() == birthDate)
{
for (auto y = allSports.begin(); y != allSports.end(); y++) {
if (y->getSportName() == sportName)
{
s = allSportsmen.at(x);
sport = allSports.at(y);
participants[s].push_back(sport);
}
}
}
}
}
行:
s = allSportsmen.at(x);
sport = allSports.at(y);
我有错误:
C++ no instance of overloaded function matches the argument list argument types are: (std::_Vector_iterator<std::_Vector_val<std::conditional_t<true, std::_Simple_types, std::_Vec_iter_types<Sportsman, size_t, ptrdiff_t, Sportsman *, const Sportsman *, Sportsman &, const Sportsman &>>>>) object type is: std::vector<Sportsman, std::allocator>
运动也是如此
然后:
Compiler Error C2679
binary '[' : no operator found which takes a right-hand operand of type 'std::_Vector_iteratorstd::_Vector_val<std::_Simple_types<_Ty>>' (or there is no acceptable conversion)
如何解决此问题并正常传递存储在其向量中的这位运动员和运动?顺便说一句,这张地图应该接收像 map<Sportsman*, vector<Sport>*> participants;
这样的指针吗?
如果你想要指针,你必须获取解引用迭代器的地址
s = &(*x);
sport = &(*y);
不过,我要警告您,如果您改变向量 allSportsmen
或 allSports
(例如 push_back
、emplace_back
、resize
, etc) 导致重新分配,你可能会使你的指针无效。
另请注意,您必须更改地图类型才能存储指针
map<Sportsman*, vector<Sport*>> participants;
将这些作为输入...
vector<Sportsman> allSportsmen;
vector<Sport> allSports;
map<Sportsman, vector<Sport>> participants;
...我会稍微修改它:
- 删除
allSportsmen
,因为地图中的 keys 会提供相同的列表。
- 将
allSports
设为 set<Sport>
。它们应该是唯一的,而且,如果由于删除元素或添加新元素而移动 vector
数据,指向 vector
中元素的指针可能会失效。
- 在
map
s value vector
. 中存储迭代器,而不是指针
所以,这将是我的方法:
std::set<Sport> allSports;
std::map<Sportsman, std::vector<std::set<Sport>::iterator>> participants;
如果每个 Sportsman
都应该映射到一组独特的运动,您可以考虑将 value vector
更改为 set
,制作
std::map<Sportsman, std::set<std::set<Sport>::iterator>> participants;
如果顺序不重要,您可以使用 unordered
对应顺序。
以下函数必须通过他的全名和生日在向量 allSportsmen 中找到一个运动员,然后通过它的名字找到一些运动并将这个运动员和这个运动从向量添加到映射参与者,其中键是运动员和值他做的运动是什么
vector<Sportsman> allSportsmen;
vector<Sport> allSports;
map<Sportsman, vector<Sport>> participants;
void addSportToSportsman(string fullName, string birthDate, string sportName) {
Sportsman* s;
Sport* sport;
for (auto x = allSportsmen.begin(); x != allSportsmen.end(); x++) {
if (x->getFullName() == fullName && x->getBirthDate() == birthDate)
{
for (auto y = allSports.begin(); y != allSports.end(); y++) {
if (y->getSportName() == sportName)
{
s = allSportsmen.at(x);
sport = allSports.at(y);
participants[s].push_back(sport);
}
}
}
}
}
行:
s = allSportsmen.at(x);
sport = allSports.at(y);
我有错误:
C++ no instance of overloaded function matches the argument list argument types are: (std::_Vector_iterator<std::_Vector_val<std::conditional_t<true, std::_Simple_types, std::_Vec_iter_types<Sportsman, size_t, ptrdiff_t, Sportsman *, const Sportsman *, Sportsman &, const Sportsman &>>>>) object type is: std::vector<Sportsman, std::allocator>
运动也是如此
然后:
Compiler Error C2679 binary '[' : no operator found which takes a right-hand operand of type 'std::_Vector_iteratorstd::_Vector_val<std::_Simple_types<_Ty>>' (or there is no acceptable conversion)
如何解决此问题并正常传递存储在其向量中的这位运动员和运动?顺便说一句,这张地图应该接收像 map<Sportsman*, vector<Sport>*> participants;
如果你想要指针,你必须获取解引用迭代器的地址
s = &(*x);
sport = &(*y);
不过,我要警告您,如果您改变向量 allSportsmen
或 allSports
(例如 push_back
、emplace_back
、resize
, etc) 导致重新分配,你可能会使你的指针无效。
另请注意,您必须更改地图类型才能存储指针
map<Sportsman*, vector<Sport*>> participants;
将这些作为输入...
vector<Sportsman> allSportsmen;
vector<Sport> allSports;
map<Sportsman, vector<Sport>> participants;
...我会稍微修改它:
- 删除
allSportsmen
,因为地图中的 keys 会提供相同的列表。 - 将
allSports
设为set<Sport>
。它们应该是唯一的,而且,如果由于删除元素或添加新元素而移动vector
数据,指向vector
中元素的指针可能会失效。 - 在
map
s valuevector
. 中存储迭代器,而不是指针
所以,这将是我的方法:
std::set<Sport> allSports;
std::map<Sportsman, std::vector<std::set<Sport>::iterator>> participants;
如果每个 Sportsman
都应该映射到一组独特的运动,您可以考虑将 value vector
更改为 set
,制作
std::map<Sportsman, std::set<std::set<Sport>::iterator>> participants;
如果顺序不重要,您可以使用 unordered
对应顺序。