我有一个std :: vector <int>,我想删除第n个元素.我怎么做?
std::vector<int> vec;
vec.push_back(6);
vec.push_back(-17);
vec.push_back(12);
vec.erase(???);
Run Code Online (Sandbox Code Playgroud) 好吧,我希望我在这里犯了一个愚蠢的错误.我有一个DisplayDevice3d列表,每个DisplayDevice3d都包含一个DisplayMode3d列表.我想删除DisplayDevice3d列表中没有任何DisplayMode3d的所有项目.我正在尝试使用Lambda来做它,即:
// If the device doesn't have any modes, remove it.
std::remove_if(MyDisplayDevices.begin(), MyDisplayDevices.end(),
[](DisplayDevice3d& device)
{
return device.Modes.size() == 0;
}
);
Run Code Online (Sandbox Code Playgroud)
即使出6名DisplayMode3d在MyDisplayDevices,只有1个有什么DisplayMode3d的其模式集合中,没有被从列表中删除.
我在这里犯了什么错误?
编辑:
好吧,我的错误是我应该使用MyDisplayDevices.remove_if而不是std :: remove_if,但是下面的答案对于使用std :: remove_if:p是正确的.
MyDisplayDevices.remove_if( [](DisplayDevice3d const & device)
{
return device.Modes.size() == 0;
});
Run Code Online (Sandbox Code Playgroud) 从一个std::vector容器或其他容器中删除具有特定属性的元素的任务适用于功能样式实现:为什么要烦扰循环,内存释放和正确移动数据?
但是,在C++中执行此操作的标准方法似乎是以下习惯用法:
std::vector<int> ints;
...
ints.erase(
std::remove_if(ints.begin(),
ints.end(),
[](int x){return x < 0;}),
ints.end());
Run Code Online (Sandbox Code Playgroud)
此示例从整数向量中删除小于零的所有元素.
我发现它不仅丑陋而且容易错误使用.很明显,std::remove_if不能改变向量的大小(正如其名称所暗示的那样)因为它只传递了迭代器.但是许多开发人员,包括我自己,在开始时都没有这样做.
那么有更安全,更有希望实现这一目标的方式吗?如果没有,为什么?
如果我iterator在for循环中使用an 并且erase在迭代器的当前迭代中使用,for循环应该继续正常并访问其余list元素?
从我所读到的,这应该是这种情况,并且是listvs deque或者的主要区别特征vector.为了我的目的,一个queue可能工作,但我需要这种行为.
这是我正在考虑的循环:
std::list<Sequence>::iterator iterator;
iterator=m_concurrents.begin();
for (;iterator!=m_concurrents.end();++iterator){
if (iterator->passes()){
m_concurrents.erase(iterator);
}
}
Run Code Online (Sandbox Code Playgroud) 我只想删除基于范围的循环中的指定元素:
vector<int> vec = { 3, 4, 5, 6, 7, 8 };
for (auto & i:vec)
{
if (i>5)
vec.erase(&i);
}
Run Code Online (Sandbox Code Playgroud)
怎么了?
我想为每个循环使用新的C++ 11迭代列表的所有元素并删除某些元素.例如
std::list<int> myList;
myList.push_back(1);
myList.push_back(13);
myList.push_back(9);
myList.push_back(4);
for(int element : myList) {
if(element > 5) {
//Do something with the element
//erase the element
}else{
//Do something else with the element
}
}
Run Code Online (Sandbox Code Playgroud)
是否可以使用for循环执行此操作,还是必须返回迭代器才能实现此目的?
我想删除所有项目少于vC++ 11标准容器set,这是我的代码:
void delete_less_than(set<int> & ss, int const v) {
for (auto item: ss) {
if (item < v) {
ss.erase(ss.find(item));
} else break;
}
}
Run Code Online (Sandbox Code Playgroud)
代码是否正常工作?我在我的计算机上似乎没问题(g ++ 4.7.3),但在我提交代码的一些在线判断中无限循环.
假设我有vector成对,其中每个pair对应于我正在处理的某个矩阵的索引(行和列)
using namespace std;
vector<pair<int, int>> vec;
Run Code Online (Sandbox Code Playgroud)
我想使用auto遍历整个向量并立即删除满足某些条件的所有对,例如
for (auto& x : vec) {
if (x.first == x.second) {
vec.erase(x);
}
}
Run Code Online (Sandbox Code Playgroud)
但它不起作用,因为我想vec.erase()应该有一个迭代器作为参数,x实际上pair是一个 vector 元素vec,而不是迭代器。我尝试以几种方式对其进行修改,但我不确定如何auto准确地处理容器元素以及如何解决此问题。
我可以轻松修改上面的代码以使其工作并擦除 vector 的多个元素,同时使用auto? 或者我应该修改我的方法?
现在它只是一个成对的向量,但以后会更糟,所以auto为了简单起见,我想使用它。