我想将向量的特定位置的元素设置为null,因此可以按以下方式执行:
vector<IXMLDOMNodePtr> vec1;// filled somehow
vec1[i] = nullptr;// some specific position i
PS。我希望保留一个空的条目,这个条目就像一个占位符,所以我想也许vec[i] = 0
会这样做?
答案 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);