C++从地址识别数据结构
C++ identify data structure from adress
我想知道是否有办法C++知道地址在什么数据结构中。例如,我有一个基类 (A(,它有两个继承的类(B 和 C(。在第四个类(D(中,我有两个STL向量,一个包含B的指针,第二个包含C的指针。
在 D 中,我正在实现一个撤回对象 A 的方法。在该方法中,我正在使用 D 的另一个实现函数,该函数在向量中搜索对象 A 是否存在并返回指向该对象的指针。
之后有没有办法操纵对象 A 的适当向量以直接从向量中删除它(知道它在哪个向量中以及它在向量中的位置(?
A* D::findA(string word)
{
for (unsigned int i = 0; i < vectorOfB_.size(); i++) {
if ( vectorOfB_[i]->getWord() == word)
return vectorOfB_[i];
}
for (unsigned int i = 0; i < vectorOfC_.size(); i++) {
if (vectorOfC_[i]->getWord() == word)
return vectorOfC_[i];
}
bool D::withdrawA(string word)
{
A* obj = findA(word);
if (obj != nullptr) {
}
return false;
}
此时,我知道该方法找到了对象 A,我知道它的地址,但我不知道它在什么向量中。我想使用 STL 向量类的 erased(( 方法将其从向量中撤回,但不再次执行循环来检查向量。
我想你可以使用dynamic_cast来确定 A 的指针是 B 型还是 C 型。
bool D::withdrawA(string word)
{
A* obj = findA(word);
if (obj != nullptr) {
if(dynamic_cast<B*>(obj) != nullptr) {
// do something here for the B vector
}
else if(dynamic_cast<C*>(obj) != nullptr)
{
// do something here for the C vector
}
}
return false;
}
由于您正在查询类(word
(的成员以识别对象,我认为您不需要一些Maginc机器来实现您想要的东西。
您可以使用 STL 算法来实现这一点,例如具有以下类:
#include <memory>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
class A {
public:
A(string word = "") :m_word(word){}
virtual inline string getWord() { return m_word; }
protected:
string m_word;
};
class B : public A {
public:
B(string word = "") : A(word) {}
};
class C : public A {
public:
C(string word = "") : A(word) {}
};
typedef shared_ptr<A> a_ptr;
typedef vector<a_ptr> a_vector;
你可以编写一个函数:
a_ptr find_A(a_vector v, string word, bool erase = false){
// Find the element.
auto it = find_if(v.cbegin(), v.cend(),
[word](const a_ptr &elem) {
return elem->getWord() == word;
}
);
// If you want to erase and it was found.
// The code below can be implemented in a more elegant way, but
// for that your classes will require you overload < operator and == operator.
if (erase && it != v.end()) {
v.erase(remove_if(v.begin(), v.end(),
[word](a_ptr elem){
return elem->getWord() == word;
}
), v.end());
}
return *it
}
现在,您将该函数与两个向量一起使用。
一个更具体的例子。
您也可以使用 STL 算法从向量中擦除:
假设您发现了一些A*
A* a_ptr = findA(word);
然后你可以使用 STL 擦除,remove_if成语:
vectorOfB_.erase(remove_if(vectorOfB_.begin(), vectorOfB_.end(),
[a_ptr](A* elem){
return elem->getWord() == a_ptr->getWord();
}
), vectorOfB_.end());
vectorOfC_.erase(remove_if(vectorOfC_.begin(), vectorOfC_.end(),
[a_ptr](A* elem){
return elem->getWord() == a_ptr->getWord();
}
), vectorOfC_.end());
在C++中,没有办法通过地址直接知道数据结构。
相关文章:
- 链表,反向函数,数据结构
- 如何使用set实现无序数据结构?
- 我们可以将数据永久保存为数据结构吗?
- C++中的可变长度数组/数据结构
- 用于存储由空格分隔的字符串的 C++/C 数据结构
- 通过 NIF 从C++返回自定义数据结构
- 编译器上的策略数据结构不起作用
- 尝试构建"lock-free"数据结构C++
- 设计将引用元素移动到开头的数据结构.C++
- 在学习数据结构之前对STL有一个了解是好的吗?
- 如何解析表示树状数据结构的字符串
- 我对数据结构、双向链表有一些问题
- googletest:测试太大的数据结构
- C++中deque数据结构的大O是什么?
- 我可以使用哪种数据结构来处理这种方式
- 将文本文件解析为树状数据结构
- C++ 中具有 O(1) 搜索时间复杂度的数据结构
- 哪些存储了不完整类型的 STL 数据结构可以用作类成员?
- C++,您能否设计一种数据结构,将指针保存在连续内存中并且不会使它们失效?
- C++从地址识别数据结构