删除包含相同项目的向量中的一个项目

时间:2017-12-13 20:28:08

标签: c++ string vector

想象一下,您有vector<string> inventoryappleoranges。如何删除向量中的单个apple而不是所有applestd::remove通常会这样做,因为字符串是相同的,从我所知道的。这是我认为需要改变的路线。

inventory.erase(remove(inventory.begin(), inventory.end(), "apple") inventory.end());

2 个答案:

答案 0 :(得分:3)

const std::string apple = "apple";
const auto it = std::find(std::cbegin(inventory), std::cend(inventory), apple);

if (it != std::cend(inventory)) inventory.erase(it);

您只需找到第一个,如果存在,则删除。

Example

答案 1 :(得分:2)

正如Edgar Rokyan所述,您可以使用std::find()std::vector::erase()轻松删除一个实例。

TRANSFORM First(tblDiagnoses.fDgCode) AS FirstCode
SELECT tblDiagnoses.fName
FROM tblDiagnoses
GROUP BY tblDiagnoses.fName
PIVOT DCount("*","tblDiagnoses","fName='" & [fName] & "' AND fDgCode<" & [fDgCode])+1;

当一个项目从一个向量中消失,并且位于中间的某个位置时,它右边的所有项目必须向左移动一个插槽,这意味着const auto it = std::find(std::cbegin(inventory), std::cend(inventory), apple); if (it != std::cend(inventory)) inventory.erase(it); 复杂度。如果您不关心向量内元素的顺序,可以通过将最后一个组件移动到要删除的组件的位置,将复杂度降低到O(n),然后删除最后一个位置向量:

O(1)

在这种情况下,更好的方法是通用模板函数,因此您可以使用不同类型:

auto it = std::find(std::begin(inventory), std::end(inventory), apple);
if (it != std::end(inventory)) {
    *it = std::move(inventory.back());
    inventory.pop_back();
}

LIVE DEMO