如何检查类实例的向量的索引是否为空

时间:2018-10-17 02:25:36

标签: c++ vector indexing

我有一个名为Node的类的实例向量。我希望能够确定是否填充了向量的特定索引。

请参见下面的示例代码:

#include <iostream>
#include <vector>
#include <string>
using namespace std;

class Node {

    int testVal;

public:
    //Default Constructor
    Node() {};
    Node(int a){testVal = a;}

    int getTestVal(){return testVal;}

};


int main(){

    vector<Node> testVector;
    testVector.resize(2);

    Node testNode = Node(5);
    testVector[1] = testNode;

    for (int i = 0;i < 2;i++){

        if (testVector[i] == NULL){
            cout << "Missing Data" << endl;
           }
        else{ 
            cout << testVector[i].getTestVal << endl;
           }     
    }

}

代码在if语句中崩溃。特定索引为空的最佳条件是什么?

2 个答案:

答案 0 :(得分:1)

您的要求是不可能的。

向量存储值而不是指针,因此您永远不会得到null。

如果要检查“空”点,请声明一个存储节点地址的向量:

std::vector<std::shared_ptr<Node>> testVector;

要在矢量的第二个索引中存储项目,请执行以下操作:

testVector[1] = std::make_shared<Node>(5);

现在您的其余代码应能按预期工作(只需将对getTestVal()函数的调用修复)。

答案 1 :(得分:0)

我认为您误解了C ++语义。

std::vector< Node> testVector; // creates empty vector of Node objects, no Node allocations made here

testVector.resize( 2 ); // calls default constructor and instantiates 2 new Node objects here

// could be done as std::vector< Node > testVector( 2 );

该向量已经为这2个节点分配了内存,因为默认构造函数定义了该类,所以它存在。听起来您想要更多类似的东西:

...
std::vector< Node * > testVector( 2, null_ptr );
testVector[ 1 ] = new Node( 5 );

for( const auto & ptr : testVector )
    if( ptr )
        std::cout << ptr->getTestVal() << std::endl;

...
delete testVector[ 1 ];

正如其他人所提到的,智能指针对象也可以用于为您管理内存并表现类似。