【问题标题】:Delete an element from a Vector and move rest of elements down - C++从 Vector 中删除一个元素并将其余元素向下移动 - C++
【发布时间】:2015-01-14 19:50:38
【问题描述】:

我有一个“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 从 'SimpleStruct' 到 'int'。

如果这很明显,请原谅我,我是 C++ 新手。我怎样才能消除这个问题?

【问题讨论】:

  • 您的 lambda 应该采用 SimpleStruct 参数,而不是 int(或 SimpleVertex,您的错误让我相信您实际在使用)。

标签: c++ arrays vector struct


【解决方案1】:

如果你想删除索引 3 处的元素,你可以这样做:

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

使用std::vector,您无需明确“将所有其他元素向下移动” - 它会在erase 之后为您执行此操作。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      要删除索引 3 处的元素,请改为:

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

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

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

      【讨论】:

        猜你喜欢
        • 2020-04-24
        • 1970-01-01
        • 2018-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多