将指向矢量中元素的指针设置为null,然后检查指针是否为null(C++)
Set pointer to element in vector to null, then check whether pointer is null (C++)
我想将向量数组中某些元素的指针设置为NULL(基于标准),然后检查元素指针是否为NULL。如果指向该元素的指针为NULL,我将从向量数组中删除该元素。
我的编译器给了我一个错误,说地址表达式必须是左值或函数指示符,我不明白为什么(代码中注释的行位置)。由于我使用&
获取值的地址,是否没有看到指向该元素的指针是否为NULL?
我包括了前面的代码,因为错误可能就在那里,
相关代码:
vector<particle> pl = c.particlelist;
vector<particle> noncollision = c.particlelist;
vector<vector<particle>> collisionlist = new vector<vector<particle>>();
for (int i = 0; i < c.numparticles-1; i++){
particle first = pl[i];
for (int j = i+1; j < c.numparticles; j++)
{
particle second = pl[j];
double d = distance(first, second);
if (d==0)
{
vector<particle> temp = {pl[i], pl[j]};
collisionlist.push_back(temp);
noncollision[i].setxposint(NULL);
noncollision[j].setxposint(NULL);
}
else
{
}
}
}
int j = 0;
for (int i = 0; i < noncollision.size(); i++)
{
if (&(noncollision[i].getxpos()) == NULL) ////// ERROR HERE
{
noncollision.erase(noncollision.begin()+i);
}
else
{
j++;
}
}
我是C++的新手,如果你能提出一种更优雅的方法或修复方法,我将不胜感激。我还假设我将指针设置为元素noncollision[i].setxposint(NULL);
的方法是正确的?我可以使用函数返回一个整数并获取地址吗?
getxpos和setxposint:的函数
int particle::getxpos(){
return xpos;
}
void particle::setxposint(int b){
xpos = b;
}
您使用&
获取一个指向临时值(来自getxpos
的返回值)的指针,这是不允许的;由于临时地址将消失,因此该地址在任何方面都不会有用,因此语言不允许使用它。即使你可以获得它的地址,它也肯定不会为NULL。
noncollision[i].setxposint(NULL);
这条线所做的只是将xpos
设置为零。通常,术语NULL
用于指针,0
用于整数等事物。不管怎样,NULL
通常是0L
的宏。
&(noncollision[i].getxpos()) == NULL
这是不正确的,它试图从成员方法getxpos()
获取返回值的地址,并将其与NULL
进行比较。而你真正想做的只是看看函数是否返回零。所以只需将这一行更改为:
noncollision[i].getxpos() == 0
我将解释为什么编译器不能理解您的意思。
当你写
&(someFunction())
您正在请求函数返回的东西的地址。但是函数返回值。值没有地址。变量有地址。
当某个东西是一个内存字(它将包含一个值)时,它可以用作左值(左值),因为你可以将东西放入该内存字:
int b = 1; //make room for an `int` on the stack, then put a `1` there.
当某个值只是一个值时,它只能用作右值。以下内容不会编译,原因与您的代码不会编译的原因相同:
int b; //make room for an `int` on the stack.
42 = b; //ERROR, this makes no sense.
if (42 == NULL) { std::cout << "this is never true" << std::endl; }
&42; //ERROR, 42 isn't a piece of memory, it's a value.
(注意:您可以使用值来指代内存中的单词:这种用法被称为指针,例如
int b = 1;
*((int *)(42)) = b;
意思是"将b
的值放入地址为42
的内存。这编译良好(但如果不允许在42写入内存,则会崩溃。)
在我看来,你正试图跟踪"已访问"的项目,但不确定具体是哪种方式。
您可以使用"外部"标记,而不是"修改"项目。这里的一套看起来不错。您可以在粒子列表中使用一组iterator
s,或者在这种情况下使用一组可能更稳定的indices
(i
,j
)。
这里有一个开始:
#include <vector>
#include <set>
struct particle { };
double distance(particle const&, particle const&) { return 1.0; }
struct context
{
std::size_t numparticles;
std::vector<particle> particlelist;
context() : numparticles(100), particlelist(numparticles) {}
};
static context c;
int main()
{
using std::vector;
using std::size_t;
vector<particle> pl = c.particlelist;
vector<vector<particle>> collisionlist;
std::set<size_t> collision;
for(size_t i = 0; i < c.numparticles-1; i++)
{
particle first = pl[i];
for(size_t j = i+1; j < c.numparticles; j++)
{
particle second = pl[j];
double d = distance(first, second);
if(d < 0.0001)
{
collisionlist.push_back({pl[i], pl[j]});
collision.insert(i);
collision.insert(j);
}
else
{
}
}
}
for(size_t i = 0; i < pl.size(); i++)
{
if(collision.end() != collision.find(i))
{
// do something
}
}
// alternatively
for (int index : collision)
{
particle& p = pl[index];
// do something
}
}
注意要非常小心浮点比较如
if (d==0.0) // uhoh
因为它可能不会达到你所期望的
- 比较浮点值有多危险
- 浮动和双重比较最有效的方法是什么
- 浮点==是否正常
您似乎正在尝试检查点对是否存在冲突。然后记录每个点是否有任何碰撞。这最好通过一个简单的标志列表来处理:
std::vector<bool> has_collision(c.numparticles, false); // init: no collisions found
之后:
if (d==0)
{
has_collision[i] = true;
has_collision[j] = true;
}
最后,遍历标志列表,得到没有冲突的点:
for (size_t i = 0; i < c.numparticles; ++i)
{
if (!has_collision[i])
{
// whatever
// possibly push_back pl[i] into some list
}
}
此外:使用vector
来保持一对(i,j)
点是令人困惑的。标准库具有用于此类目的的std::pair
类型。
另外:您不需要显式动态分配(new
);让标准库以一种安全、无混乱的方式为您管理内存。代替
vector<vector<particle>> collisionlist = *new vector<vector<particle>>();
使用
vector<vector<particle>> collisionlist;
(或如上所述的vector<pair<particle, particle>>
)。
- 当使用通配符和null指针调用函数时,对输出的说明
- 当目标指针不是基类的类型时,为什么允许dynamic_cast为多态类生成 null 指针?
- API 返回智能指针的 std::optional 以明确指定指针可能为 null 是否有意义?
- 为什么在C++中增加指针后打印了一个值而不是 NULL/0?
- 指针永远不会在链表深层复制构造函数中达到 null
- 正在将对象指针数组初始化为NULL
- 为什么在C++中使用delete后指针不为NULL
- C++中的指针否定 (!ptr == NULL)
- 如何返回值为NULL的变量指针
- 打印空指针时,std::cout 可以打印 "NULL" 而不是 0 吗?
- 将位数组转换为 HBITMAP 后 bmBits 的 NULL 指针
- C++ 由于类析构函数中的指针设置为 NULL 而导致的内存泄漏
- 如果指针在C++为 NULL 则修改指针
- 在访问类的树层次结构中的对象时避免使用 null 指针
- if(NULL==指针)和if(指针==NULL)之间有什么区别
- 从转储中获取调用堆栈的几乎所有帧中的此指针 NULL 表明什么
- 指针 NULL 在C++中的函数
- 自动指针= NULL错误
- 如何使指针指向指针NULL
- 当我们分配指针 NULL 时会发生什么