12

我正在尝试从向量中获取单个元素并将其推到向量的后面,然后将其删除,这样我就不会在内存中有一个空白部分。erase-remove 习惯用法可以做到这一点,但它会删除特定值的所有实例。我只想删除第一个。

我对标准库算法不太熟悉,也找不到合适的方法(如果有的话)来做到这一点。这是一个例子:

int main() {
    std::vector<int> v{1, 2, 3, 3, 4};

    remove_first(v, 3);

    std::cout << v; // 1, 2, 3, 4
}

那么我将如何从这个向量中删除第一次出现的 3 呢?

4

2 回答 2

21

先找到它,然后擦除它:

auto it = std::find(v.begin(),v.end(),3);
// check that there actually is a 3 in our vector
if (it != v.end()) {
  v.erase(it);
}
于 2013-02-06T20:09:15.073 回答
11

如果您不关心保持向量中元素的顺序,则可以避免在擦除时复制剩余元素的“尾部”:

auto it = std::find(v.begin(), v.end(), 3);
if (it != v.end()) {
  std::iter_swap(it, v.end() - 1);
  v.erase(v.end() - 1);
}
于 2013-02-07T14:37:01.287 回答