【问题标题】:How can I check if a vector with a custom class is NULL?如何检查具有自定义类的向量是否为 NULL?
【发布时间】:2015-01-08 14:04:57
【问题描述】:

我已经制作了这个自定义类

#ifndef VEHICLE_H_
#define VEHICLE_H_

Class Vehicle {
 public:
 Vehicle();
 Vehicle(char,char,int,int);
 virtual ~Vehicle();
 char getLicense_plate();
 void setLicense_plate(char);
 char getBrand();
 void setBrand(char);
 int getTime_in();
 void setTime_in(int);
 int getTime_out();
 void setTime_out(int);

 char license_plate;
 char brand;
 int timei;
 int timeo;
};

我在 main.cpp 中创建了一个大小为 50 的 Vehicle 向量,但我不知道每个值是否为空。

#inlcude<iostream>
#include<vector>
#include<algorithm>
#inlude "Vehicle.h"
using namespace std;

int main()
{
vector<Vehicle> avai_space(50);
for(int i=0;i<avai_space.size();i++)
 { 
  //if(avai_space(i) == NULL??){}

【问题讨论】:

  • 它们不是“空的”——向量包含 50 个Vehicles,全部由默认构造函数构造。 (C++ 不是 Java。)
  • 它们不能为空,它们不是指针。在这个向量中有 50 个默认构造的车辆。
  • 为什么类要大写?
  • char license_plate; char brand; 1 个字符来存储车牌或品牌?对这些以及 getter 和 setter 使用 std::string 而不是 char。

标签: c++ class if-statement vector null


【解决方案1】:

vector&lt;Vehicle&gt; avai_space(50);不会创建存储容量为50的空向量;它创建一个包含 50 个有效条目的向量,其中每个条目都使用Vehicle 类的默认构造函数进行初始化。

要创建一个最大存储为 50 的空向量,请使用:

vector<Vehicle> vehicle_vec;
vehicle_vec.reserve(50);

您可以使用vehicle_vec.push_back() 将项目添加到向量中,而不会影响存储。

在向量中填充条目后,您现在可以使用vehicle_vec.size() 遍历此向量中的有效条目:

for (size_t i = 0 ; i < vehicle_vec.size() ; i++) {
    // Use vehicle_vec[i], for e.g.
    std::cout << vehicle_vec[i].brand << "\n";
}

【讨论】:

  • 好吧,我明白了,但是在创建了我使用的向量之后(unsigned int i=0;i
  • Vehicle 不包含 size() 成员,如果它确实将 size 与 NULL 进行比较没有多大意义。
  • @user4433128 您无法检查向量中的特定元素是否有效。您可以做的是查看有多少元素是有效的,并且只在有效的元素中进行迭代
【解决方案2】:

vector&lt;Vehicle&gt; avai_space(50); 创建 50 个Vehicles。它们存在于这一行之后并且不为空,但是 Vehicle 的默认构造函数使它们成为什么。

如果你想在你的向量中存储Vehicles,但还没有创建它们(我假设这就是你对== NULL的意思),只需写vector&lt;Vehicle&gt; avai_space;,然后在末尾添加新的Vehicless std::vector::push_back.

【讨论】:

    【解决方案3】:

    任何元素都不会是“空”的,就像在空指针中一样,因为它们是按值存储的,而不是按指针存储的。

    这种情况对应于这样的声明

    std::vector<Vehicle*>
    

    或者,如果指针需要拥有对象

    std::vector<std::unique_ptr<Vehicle>>
    

    【讨论】:

    • boost::optional 会更好。这里不需要动态分配;您将分配开销增加了一个数量级,并且将内存局部性增加了一个数量级,这两者都没有任何理由。
    • @LightnessRacesinOrbit 这是一个很好的观点。我只是在遵循 OP 的面向指针的推理路线,并试图澄清为什么他的示例中没有空值。
    猜你喜欢
    • 1970-01-01
    • 2021-10-07
    • 2021-07-06
    • 2014-07-19
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多