当我像这样插入矢量时:
*frontIter = vec[idx];
我得到一个段错误,但是如果我做了
vi vec(10);
它没有任何问题。我知道[]运算符有能力为对象分配空间然后插入它,是插入不分配空间的错误,它是否需要在某个位置调用insert时已经分配空间?
我认为这个错误是由于我对这有什么困惑:
vec.resize(10)
这类似于vec.reserve(10)
或using vi = std::vector<int>;
using size = std::size_t;
// return vi after partition
vi partition_space(const vi & vec, size n)
{
vi resVec(vec.size());
int partVal = vec[n];
//resVec[n] = partVal;
// iterators to the back and front of the resVec.
// insertion will happen at the iters
vi::iterator frontIter = resVec.begin();
vi::reverse_iterator backIter = resVec.rbegin();
for(size idx = 0 ; idx < vec.size() ; ++idx)
{
if(idx == n)
{
continue;
}
if(vec[idx] < partVal) // insert in front of partVal
{
// *frontIter = vec[idx];
resVec.insert(frontIter , vec[idx]);
++frontIter;
}
else if(vec[idx] > partVal)// insert at back of n
{
*backIter = vec[idx];
++backIter;
}
else // repeated elements .. random choose to put it in front.. both choice does not matter
{
//resVec.insert(frontIter , vec[idx]);
*frontIter = vec[idx];
++frontIter;
}
}
frontIter++;
if(!std::distance(frontIter , backIter.base()))
{
std::cout << " ! " << std::endl;
}
*backIter = partVal;
return resVec ; // nrvo
}
在我调用vec.reserve(10)之后插入不能作为位置9工作吗?
这是代码段,只是为了确保我没有遗漏任何东西。
duk_push_c_function(ctx, someFunction, 1 /*nargs*/);
duk_push_pointer(ctx, (void *) somePointer);
duk_put_prop_string(ctx, -2, "_ptr");
duk_put_global_string(ctx, "someFunction");
答案 0 :(得分:2)
错误是由于第一次插入发生后迭代器frontIter
失效。以下是最新消息:
vec
,其中包含10个元素。frontIter
中,此触发器向量存储重新分配,因为向量超出其容量,因此插入代码重新分配内部存储以容纳插入。因此,此操作使所有 vec
迭代器