假設“假設”,我有以下代碼:
//two separate arrays of the same object that for the purposes of this question we will assume are not adjacent in memory
ObjectName* m_objects0 = new ObjectName[10];
ObjectName* m_objects1 = new ObjectName[10];
//and a pointer to a single object
ObjectName* m_pObject = nullptr;
如果我想遍歷每個物件m_objects0直到到達結尾,然后“跳轉”到開始m_objects1以遍歷它,我將如何檢查的地址是否m_pObject位于任一陣列的開始地址和結束地址之間?(我唯一的資訊是每個陣列的開始和結束地址)它甚至可行嗎?
我能想到的唯一方法是以某種方式將地址轉換為int.
uj5u.com熱心網友回復:
您可以使用==and!=運算子檢查給定的指標是否(in)等于任何其他指標。
但是,只有當兩個指標都指向同一個物件/陣列時,您才能檢查給定的指標是<(=)或>(=)另一個指標,否則行為未定義。
因此,雖然m_pObject指向 中的元素m_objects0,但您無法檢查它是否(不)指向m_objects1使用地址范圍的元素。
但是,您可以改為執行以下操作:
ObjectName* m_objects0 = new ObjectName[10];
ObjectName* m_objects1 = new ObjectName[10];
...
ObjectName* object_ptrs[] = {
m_objects0, m_objects0 10,
m_objects1, m_objects1 10
};
for(int i = 0; i < 4; i = 2)
{
ObjectName* m_pObject = object_ptrs[i];
ObjectName* m_pObjects_end = object_ptrs[i 1];
while (m_pObject != m_pObjects_end)
{
...
m_pObject;
}
}
...
在線演示
其中,您可以使用以下內容進一步概括(即,如果您需要 2 個以上的陣列):
#include <vector>
#include <utility>
ObjectName* m_objects0 = new ObjectName[10];
ObjectName* m_objects1 = new ObjectName[10];
...
std::vector<std::pair<ObjectName*,ObjectName*>> object_ptrs;
object_ptrs.emplace_back(m_objects0, m_objects0 10);
object_ptrs.emplace_back(m_objects1, m_objects1 10);
...
for(auto &p : object_ptrs)
{
ObjectName* m_pObject = p.first;
ObjectName* m_pObjects_end = p.second;
while (m_pObject != m_pObjects_end)
{
...
m_pObject;
}
}
...
在線演示
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/384343.html
上一篇:如何洗掉存盤在節點中的指標?
下一篇:如何擦除指標向量的某些元素
