1

这是我想要实现的目标:

#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_ptrstd::shared_ptr在两个单独的测试中使用reset切换,并且在第一个测试之后都给出随机数,正如预期的那样。

接下来,我尝试了std::weak_ptr它看起来像我需要的东西,尽管界面并不是那么相似。从我所看到的,使用它的唯一方法是 through lock(),所以我尝试lock().在调用之前reset附加它并将其附加到取消引用,但是崩溃了。

我如何使用std::weak_ptr而不是原始指针,或者我可以以某种方式实际使用其他指针之一?

4

3 回答 3

4

我认为您应该研究 using std::vector::iterator,而不是使用原始指针进行这种类型的索引操作,请记住,任何插入 a 的操作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';
}
于 2012-05-07T17:36:15.057 回答
4

根据定义,智能指针并不是“好得多”。它们仅在需要管理所指向的内存时才有用。

由于您的指针只是指向 a 中的元素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();
    }
}
于 2012-05-07T17:37:13.953 回答
0

刚刚意识到您可能意味着您想要一个指向向量中int的智能指针,而不是将向量中的 int 更改为智能指针。我根本不会那样做。我会使用向量的迭代器:

for (int i = 0; i < 10; ++i) {
  auto it = it.begin() + (i % 2 ? 1:0);
  f(*it);
}

使用 shared、unique 或任何其他指向向量内部的指针会导致坏的、坏的、坏的事情。也不保证使用原始指针,因为它们不指示任何关于它们所指向的内容。另一方面,向量的迭代器虽然可能实现为原始指针,但对于它们的使用有明确的、记录在案的规则,您可以通过使用它们在代码中记录这些规则。

不要忘记“智能指针”包括迭代器。

于 2012-05-07T17:49:47.040 回答