想象一下,您有vector<string> inventory
个apple
和oranges
。如何删除向量中的单个apple
而不是所有apple
? std::remove
通常会这样做,因为字符串是相同的,从我所知道的。这是我认为需要改变的路线。
inventory.erase(remove(inventory.begin(), inventory.end(), "apple") inventory.end());
答案 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);
您只需找到第一个,如果存在,则删除。
答案 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();
}