gpt4 book ai didi

c++ - 从 vector 中删除后的重复指针

转载 作者:行者123 更新时间:2023-11-30 05:48:56 29 4
gpt4 key购买 nike

我重载了 operator-=() 以从指针 vector 中删除元素(指针是唯一的,因此不需要删除所有出现的地方,一旦指针被删除,循环就可以终止):

Rooms& Rooms::operator-=(Course *c) {
for (Iter i = rooms.begin(); i != rooms.end(); ++i) {
if (**i == *c) {
*i = NULL;
i = rooms.erase(i);
break;
}
}
return *this;
}

问题是,在应用于 vector 之后,我得到了 vector 最后一个元素的重复指针。之前:

-------------------------------------------------------------------
| POL | CAE | RUS | ENG | BUS | JPY | | | | | |
| G 1 | G 1 | G 2 | G 2 | G 2 | G 2 | | | | | |
| 9 | 9 | 10 | 10 | 10 | 10 | | | | | |

删除 ENG 和 BUS 后:

-------------------------------------------------------------------
| POL | CAE | RUS | JPY | JPY | JPY | | | | | |
| G 1 | G 1 | G 2 | G 2 | G 2 | G 2 | | | | | |
| 9 | 9 | 10 | 10 | 10 | 10 | | | | | |

应该改变什么才能实际得到结果:

-------------------------------------------------------------------
| POL | CAE | RUS | JPY | | | | | | | |
| G 1 | G 1 | G 2 | G 2 | | | | | | | |
| 9 | 9 | 10 | 10 | | | | | | | |

我们将不胜感激。

编辑:

我的打印函数如下所示:

std::ostream& operator<<(std::ostream& out, const Rooms& rs) {
std::vector<std::string> output(3);
std::ostringstream temp;
for (int i = 0; i < rs.rooms.capacity(); ++i) {
if (rs.rooms[i]) {
temp << "| " << rs.rooms[i]->getCode() << " ";
output[0] += temp.str();
temp.str("");
temp << "| G" << std::setw(CODE_LENGTH - 1)
<< rs.rooms[i]->getGroup() << " ";
output[1] += temp.str();
temp.str("");
temp << "| " << std::setw(CODE_LENGTH)
<< rs.rooms[i]->getSize() << " ";
output[2] += temp.str();
temp.str("");
} else {
output[0] += "| ";
output[1] += "| ";
output[2] += "| ";
}
}
output[0] += "|";
output[1] += "|";
output[2] += "|";
out << printHorizont(rs.size) << output[0] << std::endl
<< output[1] << std::endl << output[2] << std::endl;
return out;
}

看起来很复杂,但找不到更好的打印方式。

最佳答案

operator<<() ,

for (int i = 0; i < rs.rooms.capacity(); ++i) {

对于 rs.rooms.size() <= i < rs.rooms.capacity() , 基本上是 rs.rooms[i]是非法的。

使用迭代器遍历 vector ,你永远不会犯这样的错误。如果你真的需要打印那些“空白”,你可以写成

for (int i = 0; i < rs.rooms.capacity(); ++i) {
if (i < rs.rooms.size() && rs.rooms[i]) {
// access rs.rooms[i]
} else {
// print empty placeholder
}
}

关于c++ - 从 vector 中删除后的重复指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28001521/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com