删除二维向量中的行

时间:2019-04-21 23:29:24

标签: c++

我有一个2D向量,我想删除它的某些行。 原始向量如下:

打开/关闭音符Von Voff持续时间

245 144 64 62 64 1132
261 144 41 73 64 1197
272144 69 116 64 1108
293144 72 102 64 1060
1353 128 72 64
1377 128 64 64
1380 128 69 64
1458 128 41 64
1519 144 40 83 64 1321
1519 144 62 83 64 1176
1547 144 68 93 64 1167
1564 144 72 116 64 1135
2695 128 62 64
2699 128 72 64
2714 128 68 64
2819 144 60 79 64 1294
2840 128 40 64
2857 144 45 89 64 1322
2874 144 67 97 64 1204
2905 144 71 112 64 1173
4078 128 67 64
4078 128 71 64
4113 128 60 64
4179 128 45 64

我有一些问题要做。

我尝试使用代码:

void DeleteNoteOff(std::vector<std::vector<int> > &eventStore){
  for(int i = 0; i<eventStore.size(); i++){
    if(eventStore[i][1] == 128){
      eventStore.erase(eventStore.begin()+i);
    }
  }
}

结果未完全删除。

打开/关闭音符Von Voff持续时间

245 144 64 62 64 1132
261 144 41 73 64 1197
272144 69 116 64 1108
293144 72 102 64 1060
1377 128 64 64
1458 128 41 64
1519 144 40 83 64 1321
1519 144 62 83 64 1176
1547 144 68 93 64 1167
1564 144 72 116 64 1135
2699 128 72 64
2819 144 60 79 64 1294
2857 144 45 89 64 1322
2874 144 67 97 64 1204
2905 144 71 112 64 1173
4078 128 71 64
4179 128 45 64

需要帮助!

2 个答案:

答案 0 :(得分:2)

  

我想删除所有以“ 128”作为第二个元素的行。

无需编写循环来执行此操作。

可以使用std::remove_if / std::remove算法和vector::erase一起从向量中删除满足特定条件的所有项目:

#include <iostream>
#include <vector>
#include <algorithm>

void DeleteNoteOff(std::vector<std::vector<int> > &eventStore)
{
   eventStore.erase(std::remove_if(eventStore.begin(), eventStore.end(), 
                    [](const std::vector<int>& v) {return v.size() > 1 && v[1] == 128;}), 
                    eventStore.end());
}

int main()
{
   std::vector<std::vector<int>> test = {{245,144,64,62,64,1132},
                                        {261,144,41,73,64,1197},
                                        {272,144,69,116,64,1108},
                                        {293,144,72,102,64,1060},
                                        {1353,128,72,64},
                                        {1377,128,64,64},
                                        {1380,128,69,64},
                                        {1458,128,41,64},
                                        {1519,144,40,83,64,1321},
                                        {1519,144,62,83,64,1176},
                                        {1547,144,68,93,64,1167},
                                        {1564,144,72,116,64,1135},
                                        {2695,128,62,64},
                                        {2699,128,72,64},
                                        {2714,128,68,64},
                                        {2819,144,60,79,64,1294},
                                        {2840,128,40,64},
                                        {2857,144,45,89,64,1322},
                                        {2874,144,67,97,64,1204},
                                        {2905,144,71,112,64,1173},
                                        {4078,128,67,64},
                                        {4078,128,71,64},
                                        {4113,128,60,64},
                                        {4179,128,45,64}};
    DeleteNoteOff(test);
    for (auto& v : test)
    {
       std::cout << "{";
       for (auto& v2 : v)
          std::cout << v2 << " ";
       std::cout << "}\n";
    }
}

输出:

{245 144 64 62 64 1132 }
{261 144 41 73 64 1197 }
{272 144 69 116 64 1108 }
{293 144 72 102 64 1060 }
{1519 144 40 83 64 1321 }
{1519 144 62 83 64 1176 }
{1547 144 68 93 64 1167 }
{1564 144 72 116 64 1135 }
{2819 144 60 79 64 1294 }
{2857 144 45 89 64 1322 }
{2874 144 67 97 64 1204 }
{2905 144 71 112 64 1173 }

Live Example

快速说明:

std::remove_if将所有需要删除的项目移到eventStore向量的末尾。 std::remove_if的返回值是对已删除项目的开头的迭代器。

remove_if条件由lambda函数指定,该函数接受单个内部向量并检查向量中的第二个值是否为128(请注意检查以确保向量中至少包含2个项目)。如果lambda函数的返回值为true,则该向量将被“删除”(即移动到eventStore的末尾)。

最后,eventStore.eraseremove_if获取此返回值,并擦除所有从已移动(已删除)项目开始的地方开始的项目,直到向量的结尾。

答案 1 :(得分:1)

在删除元素时,每次迭代也要增加i,这是不应该发生的(因为这最终会跳过一些包含128的向量。更具体地说,它将跳过第二,第四,第六次连续出现-确实如此)。改用它:

void DeleteNoteOff(std::vector<std::vector<int> > &eventStore) {
  for(int i = 0; i<eventStore.size(); ) {
    if(eventStore[i][1] == 128) {
      eventStore.erase(eventStore.begin()+i);
    }
    else {
      i++;
    }
  }
}

我删除了i++的增量,只在没有任何元素被擦除时才能完成。