首页 > 解决方案 > 无法将内存地址转换为值

问题描述

感谢您访问我的问题!目前,当我运行此代码(C++ 中 Set 数据结构的实现)时,将打印集合中每个元素的内存地址,而不是集合中的值。为了帮助调试,这是我的代码:

#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <cassert>

#define PB push_back
typedef std::vector<int> vint;

class SetBase
{
public:
  SetBase() {}
  ~SetBase() {}

  void insert(int x)
  {
    if (!this->isInSet(x))
    {
      this->set.PB(x);
    }
  }

  int size()
  {
    return this->set.size();
  }

  bool empty()
  {
    return this->size() == 0;
  }

  int operator[](int index)
  {
    if (index >= 0 && index < this->size())
    {
      return this->set[index];
    }
    else
    {
      return -1;
    }
  }

  bool find(int target)
  {
    sort(this->set.begin(), this->set.end());

    int low = 0, high = this->size();

    while (low <= high)
    {
      long long mid = low + (high - low) / 2;
      long long guess = this->set[mid];

      if (guess == target)
        return true;
      else if (guess < target)
        low = mid + 1;
      else
        high = mid - 1;
    }

    return false;
  }

  int count(int target)
  {
    int counter = 0;

    for (int i = 0; i < this->set.size(); i++)
    {
      if (this->set[i] == target)
        counter++;
    }

    return counter;
  }

  bool operator=(SetBase &other)
  {
    if (other.size() != this->size())
      return false;

    for (int i = 0; i < other.size(); i++)
    {
      if (other[i] != this->set[i])
        return false;
    }

    return true;
  }

private:
  vint set;

  bool isInSet(int target)
  {
    for (int i = 0; i < this->size(); i++)
    {
      if (set[i] == target)
      {
        return true;
      }
    }

    return false;
  }
};

class Set : public SetBase
{
public:
  void set_union(Set *set1, Set *set2, Set &back_insertor)
  {
    for (int i = 0; i < set1->size(); i++)
    {
      if (this->isInSet(back_insertor, i))
      {
        back_insertor.insert(i);
      }
    }
  }

  void set_difference(Set set1, Set set2, Set &back_insertor)
  {
    // set_difference = set1 - set2
  }

  void set_intersection(Set set1, Set set2, Set &back_insertor)
  {
    // set_difference = set1 U set2
    for (int i = 0; i < set1.size(); i++)
    {
      for (int j = 0; j < set2.size(); j++)
      {
        if (set1[i] == set2[j])
        {
          back_insertor.insert(set1[i]);
        }
      }
    }
  }

  void printSet(Set *in)
  {
    for (int i = 0; i < in->size(); i++)
    {
      std::cout << &in[i] << "\n";
    }
  }

private:
  bool isInSet(SetBase set1, int target)
  {
    for (int i = 0; i < set1.size(); i++)
    {
      if (target == set1[i])
      {
        return true;
      }
    }

    return false;
  }
};

int main()
{
  Set *set_1 = new Set();
  Set *set_2 = new Set();
  Set *back = new Set();

  for (int i = 1; i <= 10; i++)
    set_1->insert(i);

  for (int i = 1; i <= 10; i++)
    set_2->insert(i);

  set_2->insert(11);

  set_1->set_union(set_1, set_2, *back);
  set_1->printSet(set_1);

  delete set_1;
  delete set_2;
  delete back;
}

运行set_1->printSet(set_1);线路时,我得到以下信息:

0x7fb498c05a20
0x7fb498c05a38
0x7fb498c05a50
0x7fb498c05a68
0x7fb498c05a80
0x7fb498c05a98
0x7fb498c05ab0
0x7fb498c05ac8
0x7fb498c05ae0
0x7fb498c05af8

即使这可行,我也想打印出值(整数)。任何帮助,将不胜感激!谢谢!:)

标签: c++data-structuresset

解决方案


在里面printSet(),你&in[i]用来打印每个元素。

&运算符返回您正在引用的对象的地址。因此,您获取的不是value ,而是它的地址。您应该删除它,例如:

void printSet(Set *in)
{
    for (int i = 0; i < in->size(); i++)
    {
        std::cout << (*in)[i] << "\n";
    }
}

推荐阅读