如何检查对象是否在数组中
How to check if object is in the array?
我知道即使数组中没有对象,也有一些地址。但是我想找到解决方案来检查我们将要询问的特定索引下是否有对象。我需要有这样的机制来向多边形添加新点。但在此之前,我需要知道如果有对象,对象的计数器是否应该增长或保持相同的值。也许我应该尝试用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
方法中。
关于不完整/有缺陷的部分,上面的两行有几个问题:
- "旧"数组(如果存在(不是
delete[]
d;这是一个内存泄漏。 - "旧"数组中的值(如果存在(应该复制到新数组中;现在的情况只是丢失了。
您应该在下一步中解决这些问题。
如果需要 v 检查集合中的值,最好使用关联容器,例如 STL 中的map
或set
。我从您的代码中看不出您可以轻松地将其交换
除了 Jon 的建议之外,C++ 不会牵住你的手,所以你需要显式维护数组中的 valiud 元素:a( 使用 max-valid-index 或 b( 对无效条目使用 NULL
值(最好两者兼而有之(
注意:使用 NULL
仅适用于在数组中存储指针。 否则,您将需要具有无效值(例如坐标太大/太小的Punkt
(
- 如何找到大小'x'数组是否完全填充,在C++?
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 是否基于数组B整数打印数组A中的整数
- 检查TCHAR数组输入是否为带符号整数C++
- 堆栈和队列是否像C++中的数组一样传递?
- 在函数范围内在堆栈上分配的数组在离开函数时是否总是被释放?
- 是否假定reinterpret_cast<char*>(myTypePtr)指向数组?
- 如果分配数组引发异常,是否应该释放该数组
- C++默认情况下,指针类型数组的元素是否保证初始化为 nullptr?
- 我是否不正确地集中了这些字符数组?
- 是否可以就地构造一个固定大小的数组作为函数参数?
- 在 c++ 中是否允许创建具有运行时边界的数组?
- C++ 返回指向函数内定义的静态数组的指针是否有效?
- 检查输入 std::array 指针数据是否等于某个常量数组
- 给定一个大小为 N 的数组 S,检查是否可以将序列拆分为两个序列
- C++:在多个线程中访问同一数组/向量的不同单元格是否会产生数据竞赛?
- 将对象的字节复制到数组并再次复制回来是否安全
- 是否可以将结构数组别名为结构成员数组?
- 当另一个数组是内存集时,内存集是否会更改数组长度?
- 任意大小的 constexpr 数组是否可以用作 switch 语句中的案例?