这就是我想要实现的目标:
#include <iostream>
using std::cout;
#include <vector>
using std::vector;
int main()
{
vector<int> a {3, 7};
int *p = &a.at (0); //assign 3
for (int i = 0; i < 10; ++i) //swap and print (3,7,3...)
{
p = (*p == a.at (0) ? &a.at (1) : &a.at (0));
cout << *p << '\n';
}
}
我想使用智能指针而不是原始指针,看看它们如何更好,但无法真正弄清楚如何实现来回切换(这是用于在游戏中轮流使用) ;这是Player *
)。
我尝试在两个单独的测试中使用std::unique_ptr
和std::shared_ptr
替换指针,使用reset
进行切换,并在第一个之后给出随机数,如预期的那样。
接下来,我尝试使用std::weak_ptr
,因为它看起来像我需要的,虽然界面并不是那么相似。从我看到的情况来看,使用它的唯一方法是通过lock()
,因此我尝试将lock().
添加到reset
的调用中并将其附加到取消引用,但崩溃了。
如何使用std::weak_ptr
代替原始指针,或者我可以以某种方式实际使用其中一个?
答案 0 :(得分:4)
我认为您应该考虑使用std::vector::iterator
而不是使用原始指针进行此类索引操作,请记住,对std::vector
的任何插入操作都可能使迭代器无效。例如,您可以执行以下操作:
typedef std::vector<int>::iterator iter_t;
vector<int> a {3, 7};
iter_t p = iter_t(&a.at(0)); //assign 3
for (int i = 0; i < 10; ++i) //swap and print (3,7,3...)
{
p = (*p == a.at(0) ? iter_t(&a.at(1)) : iter_t(&a.at(0)));
cout << *p << '\n';
}
答案 1 :(得分:4)
根据定义,智能指针不是“更好”。只有当他们需要管理他们指向的内存时,它们才有用。
由于您的指针只是指向vector
中的元素,因此您根本不需要智能指针。大多数智能指针会在超出范围时尝试删除他们指向的内存,在这种情况下会导致鼻子恶魔。
请注意,调整向量大小可能会导致所有指针无效。确保在指针仍在范围内时不添加或删除元素。
在这种情况下,玩家轮流,我可能根本不会使用指针,而是这样的:
int main()
{
vector<int> players {3, 7};
int current_player = 0;
while (!game_over())
{
cout << players[current_player] << '\n';
current_player = (current_player + 1) % players.size();
}
}
答案 2 :(得分:0)
刚刚意识到你可能意味着你需要一个智能指针指向向量中的 int ,而不是将向量中的int更改为智能指针。我根本不会这样做。我将使用向量的迭代器:
for (int i = 0; i < 10; ++i) {
auto it = it.begin() + (i % 2 ? 1:0);
f(*it);
}
使用共享,唯一或任何其他指向向量内部的指针会导致坏的,坏的,坏的事情。使用原始指针也不合理,因为它们没有表明他们指向的内容。另一方面,向量的迭代器虽然可能是作为原始指针实现的,但它们有明确的文档规则,可以使用它们在代码中记录。
不要忘记“智能指针”包含迭代器。