c++ - 无法将内存地址转换为值
问题描述
感谢您访问我的问题!目前,当我运行此代码(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
即使这可行,我也想打印出值(整数)。任何帮助,将不胜感激!谢谢!:)
解决方案
在里面printSet()
,你&in[i]
用来打印每个元素。
&
运算符返回您正在引用的对象的地址。因此,您获取的不是value ,而是它的地址。您应该删除它,例如:
void printSet(Set *in)
{
for (int i = 0; i < in->size(); i++)
{
std::cout << (*in)[i] << "\n";
}
}
推荐阅读
- node.js - 以快递形式发送带有模拟表单数据的 POST 请求
- javascript - 有没有办法在 rtc ice 候选中将 .local IP 地址取消屏蔽为 IPv4?
- python - 向后切片
- powershell - 使用 SilentlyContinue 时如何处理 Write-Information 管道输出
- powershell-5.0 - PackageManagement\Install-Package : 未找到指定搜索条件和模块名称的匹配项 SitecoreInstallFramework
- asp.net-core - 从 Blazor 发出 CORS 请求时如何包含凭据?
- html - 在汉堡图标旁边添加“菜单”字样-对我来说是奇怪的代码
- python - 如何计算每个节点中障碍物的高度并对A星算法公式的寻路产生影响?
- javascript - 当用户登录时用户活动登录浏览器名称存储在数据库中时,django 中是否有可能?
- javascript - 组件之间的数据传输