Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 通过值-C+从向量中删除元素+;_C++_Vector - Fatal编程技术网

C++ 通过值-C+从向量中删除元素+;

C++ 通过值-C+从向量中删除元素+;,c++,vector,C++,Vector,如果我有 vector<T> list 向量列表 如果列表中的每个元素都是唯一的,那么在我不知道是否在列表中的情况下,删除元素的最简单方法是什么?我不知道元素的索引,也不关心它是否不在列表中。您可以使用 引述: std::vector<int> v; // fill it up somehow v.erase(std::remove(v.begin(), v.end(), 99), v.end()); // really remove all elements w

如果我有

vector<T> list
向量列表
如果列表中的每个元素都是唯一的,那么在我不知道是否在列表中的情况下,删除元素的最简单方法是什么?我不知道元素的索引,也不关心它是否不在列表中。

您可以使用

引述:

std::vector<int> v; 
// fill it up somehow
v.erase(std::remove(v.begin(), v.end(), 99), v.end()); 
// really remove all elements with value 99
std::vector v;
//不知怎么把它加满
v、 擦除(std::remove(v.begin(),v.end(),99),v.end());
//真正删除所有值为99的元素

或者,如果您确定它是唯一的,只需遍历向量并删除找到的元素。比如:

for( std::vector<T>::iterator iter = v.begin(); iter != v.end(); ++iter )
{
    if( *iter == VALUE )
    {
        v.erase( iter );
        break;
    }
}
for(std::vector::iterator iter=v.begin();iter!=v.end();++iter)
{
如果(*iter==值)
{
v、 擦除(iter);
打破
}
}

根据Kiril的回答,您可以在代码中使用此功能:

template<typename T>
inline void remove(vector<T> & v, const T & item)
{
    v.erase(std::remove(v.begin(), v.end(), item), v.end());
}

如果事件是唯一的,那么应该使用
std::set
,而不是
std::vector

这还有一个
擦除
成员函数的额外好处,它可以满足您的需要

了解如何为作业使用正确的容器为您提供更具表现力的工具

#include <set>
#include <iostream>

int main()
{
   std::set<int> notAList{1,2,3,4,5};

   for (auto el : notAList)
      std::cout << el << ' ';
   std::cout << '\n';

   notAList.erase(4);

   for (auto el : notAList)
      std::cout << el << ' ';
   std::cout << '\n';
}

// 1 2 3 4 5
// 1 2 3 5
#包括
#包括
int main()
{
std::set notAList{1,2,3,4,5};
用于(自动el:notAList)

std::无法解释为什么
向量
容器的名称是
列表
。这可能会让人很困惑(对于阅读代码的人来说)@ KirilKirov,我不认为C++中的列表是保留关键字,即使如此,它只是一个例子,它是一个容器类型,就像向量是,并且两者都是非常不同的:)这是一个家庭作业问题还是你想解决一个具体的问题?如果后者描述了这个问题可能给你可供选择的解决方案,如果你以前的SOuld将其标记为HomeWork如果容器中的所有元素都必须是唯一的,并且您不需要使用其索引,那么您可能应该使用std::set而不是vector。我要注意的是,您可以使用find_if()而不是直接的迭代。你的第二个答案..我不会这样做。扩展以删除所有出现的值会让人在两个可能的地方绊倒:
iter
.erase()
之后无效,
++iter
将立即失败。必须写入
iter=v.erase(iter);
相反。如果这样做,在删除元素后,将提交一个额外的
++iter
,跳过元素。要解决此问题,在删除元素时应始终反向迭代
向量。使用数字索引将解决这些问题。
for(int i=v.size()-1;i>=0;i--)if(v[i]=VALUE)v.erase(v.begin()+i);
我知道,但我说了“扩展到删除”@bobobobo-true,但这是另一个答案,不会使我的答案出错。使用向量是有原因的,例如保留插入顺序。因此
如果出现的次数是唯一的,那么应该使用std::set,而不是std::vector
无效。让我们只关注OP的设置。
#include <set>
#include <iostream>

int main()
{
   std::set<int> notAList{1,2,3,4,5};

   for (auto el : notAList)
      std::cout << el << ' ';
   std::cout << '\n';

   notAList.erase(4);

   for (auto el : notAList)
      std::cout << el << ' ';
   std::cout << '\n';
}

// 1 2 3 4 5
// 1 2 3 5