从Vector中删除元素并向下移动其余元素 - C ++

时间:2015-01-14 19:50:39

标签: c++ arrays vector struct

我的矢量是' simpleVector' :

struct SimpleStruct
{
    XMFLOAT3 hello;
    XMFLOAT3 hi;
};

std::vector <SimpleStruct>      simpleVector(0);

我试图删除一个元素,例如simpleVector [3],然后将其余元素向下移动一个以删除空格。

simpleVector.erase(std::remove_if(simpleVector.begin(), simpleVector.end(),
    [](int i) { return i == 3; }), simpleVector.end());
  

但是,我收到此错误:无法转换参数1   &#39; SimpleStruct&#39;到&#39; int&#39;。

请原谅我,如果这很明显,我是C ++的新手。我该如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

如果要删除索引3处的元素,可以执行以下操作:

simpleVector.erase(simpleVector.begin()+3);

使用std::vector,您无需明确地将所有其他元素向下移动&#39; - 它将在erase之后为您完成。

答案 1 :(得分:1)

传递给std::remove_if的一元谓词需要能够接受SimpleStruct。它的目的是评估矢量的每个元素是否应该被删除&#34;。 您的谓词接受int,并且没有SimpleStructint的转换。您需要将谓词更改为有意义的内容。

另一方面,如果你想删除simpleVector[3]的元素,你需要的只是

simpleVector.erase(simpleVector.begin() + 3);

答案 2 :(得分:1)

要删除索引3处的元素,请执行以下操作:

simpleVector.erase( simpleVector.begin() + 3 );

另请注意,您无需担心向下移动其余元素,因为矢量会自动为您处理。

  

因为向量使用数组作为其底层存储,所以擦除向量末端以外的位置中的元素会导致容器在段擦除后将所有元素重新定位到新位置。与通过其他类型的序列容器(例如list或forward_list)对相同操作执行的操作相比,这通常是低效操作。     - cplusplus.com