如何检查对象是否在数组中

How to check if object is in the array?

本文关键字:是否 数组 对象 何检查 检查      更新时间:2023-10-16

我知道即使数组中没有对象,也有一些地址。但是我想找到解决方案来检查我们将要询问的特定索引下是否有对象。我需要有这样的机制来向多边形添加新点。但在此之前,我需要知道如果有对象,对象的计数器是否应该增长或保持相同的值。也许我应该尝试用NULL填充所有数组?

主.cpp

#include <iostream>
#include "punkt.h"
#include "wielokat.h"
using namespace std;
int main(int argc, char *argv[])
{
    Punkt  p1("p1", 10, 20); // 10x20
    Punkt  p2("p2", 1, 1);   //1x1
    Wielokat w1 ("square", 4);
    w1.set(p1,0);
    w1.set(p2,0);
    w1.showWielokat();

    system("PAUSE");
    return EXIT_SUCCESS;
}

维洛卡特.cpp

#include "punkt.h"
#include "wielokat.h"
#include <iostream>
using namespace std;
void Wielokat::increase(int n)
{
    m_ilosc = m_ilosc + n;
    m_tab = new Punkt * [m_ilosc];  
    cout<<"Dodaj "<<m_ilosc<<endl;
}
void Wielokat::decrease(int n)
{
    m_ilosc = m_ilosc - n;
    if(m_ilosc<0){ m_ilosc=0;}
    m_tab = new Punkt * [m_ilosc]; 
    cout<<"Odejmij "<<m_ilosc<<endl;
}
void Wielokat::set(Punkt p, int pos)
{
    //How to check if there was already object ?
    m_tab[pos] = new Punkt(p);
    m_counter++;
}
void Wielokat::showWielokat()
{
    for(int i=0; i<m_counter; i++){
        m_tab[i]->show();
    }
}
void Wielokat::crash(int pos){
    //after delete all elements moved one by one to the left side
    delete m_tab[pos];
    for(int i=pos; i<m_ilosc; i++){
        m_tab[i]=m_tab[pos+1];
    }
}
double Wielokat::getParimeter(){
    //here is function whih will count circuit 
}

维洛卡特·

class Wielokat {
    public:
    Wielokat(char* nazwa, int ilosc):m_nazwa(nazwa), m_ilosc(ilosc) 
    {
        m_tab = new Punkt * [m_ilosc]; 
        m_counter = 0;
    }
    Wielokat(const Wielokat& p): m_ilosc(p.m_ilosc), m_nazwa(strdup(p.m_nazwa))
    {}
    ~Wielokat()
    {
        for(int i=0; i<m_counter; i++){
            delete m_tab[i];
        }
        delete m_tab;
    }
    //Function:
    void increase(int n);
    void decrease(int n);
    void set(Punkt p, int pos);
    void crash(int pos);  //delete
    void showWielokat();
    double getParimeter();

    private:
    Punkt **m_tab;  //our tab of elemenst
    char* m_nazwa;
    int m_ilosc;
    int m_counter;
};

您正在用C++编码,这意味着您可以有一个std::vector<Punkt>(如果需要多态性,则可以使用std::vector<Punkt*>(。不要重新发明轮子;使用它。

使用std::vector根本不需要所有手动分配代码,您可以使用vec.size()检查有多少元素。

更新:好的,所以你不能使用vector因为这是家庭作业。

另一种解决方案是在初始化数组时将数组的内存清零,然后在尝试使用对象i之前检查是否m_tab[i] == 0。使用memset

看起来像
// WARNING! INCOMPLETE/BUGGY CODE!
m_tab = new Punkt* [m_ilosc];
memset(m_tab, 0, m_ilosc * sizeof(m_tab[0]));

由于您是从类中的两个位置执行此操作的,因此您应该将此逻辑移动到单独的 private 方法中。

关于不完整/有缺陷的部分,上面的两行有几个问题:

  1. "旧"数组(如果存在(不是 delete[] d;这是一个内存泄漏。
  2. "旧"数组中的值(如果存在(应该复制到新数组中;现在的情况只是丢失了。

您应该在下一步中解决这些问题。

如果需要 v 检查集合中的值,最好使用关联容器,例如 STL 中的mapset。我从您的代码中看不出您可以轻松地将其交换

除了 Jon 的建议之外,C++ 不会牵住你的手,所以你需要显式维护数组中的 valiud 元素:a( 使用 max-valid-index 或 b( 对无效条目使用 NULL 值(最好两者兼而有之(

注意:使用 NULL 仅适用于在数组中存储指针。 否则,您将需要具有无效值(例如坐标太大/太小的Punkt(