清空向量的特定元素

时间:2011-07-18 13:06:55

标签: c++ stdvector

我想将向量的特定位置的元素设置为null,因此可以按以下方式执行:

vector<IXMLDOMNodePtr> vec1;// filled somehow
vec1[i] = nullptr;// some specific position i

PS。我希望保留一个空的条目,这个条目就像一个占位符,所以我想也许vec[i] = 0会这样做?

6 个答案:

答案 0 :(得分:2)

可能erase()会有所帮助,例如

vec1.erase(vec1.begin() + i);

当您遍历下一个时,该条目将不在那里......

现在我们知道你想做什么,这样的事情应该有用......

vector<boost::optional<IXMLDOMNodePtr> > vec1;
// populate
// to erase
vec1[i] = boost::none; // now effectively null.

这是不知道这个IXMLDOMNodePtr是什么(如果它的名字暗示指针),那么只需将其设置为0即可。

vec1[i] = 0;

注意:如果您动态分配了此对象,则将其设置为0并不会清除内存,因为在Java中设置了null的内容 - 在C ++中,您必须先将其明确清理,即

delete vec1[i];
vec1[i] = 0;

答案 1 :(得分:2)

要删除元素(如果这是NULL的意思),您可以使用vector::erase

vec1.erase(vec1.begin() + i);

或者,创建一个IXMLDOMNodePtr的虚拟对象,根据您的编码标准将其视为NULL并设置该对象:

const IXMLDOMNodePtr ixNULL;  // this dummy is specially created as NULL
vec1[i] = ixNULL;
// ...
if(vec1[j] == ixNULL)
 //...

为此你需要重载IXMLDOMNodePtr::operator ==

答案 2 :(得分:0)

没有。矢量是设计连续的。这意味着带有.size()==5的向量具有元素[0][4]

您可能需要std::map<int, IXMLDOMNodePtr>

std::map<int, IXMLDOMNodePtr> vec1 = foo();
vec1.erase(i);

答案 3 :(得分:0)

使用vec1.resize(whatever_size_you_need);,它会展开向量并将每个元素默认为0.然后您可以根据需要使用[]

答案 4 :(得分:0)

您可以使用vec1.erase((vec1.begin()+i);删除矢量的第i个元素。之后vec1.size()减少1,所以如果你必须编写一个擦除向量的某些元素的循环,一个好的做法是使用向后循环;)

答案 5 :(得分:-1)

不,你不能。你需要初始化向量以获得元素

vector<IXMLDOMNodePtr> vec1(size, NULL);

或推回空元素

vec1.push_back(null);