删除2d向量中的行

问题描述 投票:0回答:2

我有一个2D矢量,我想删除它的一些行。原始矢量看起来像:

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

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

我有一些问题要做。

我试着用这个代码:

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);
    }
  }
}

结果不是完全删除。

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

245 144 64 62 64 1132 261 144 41 73 64 1197 272 144 69 116 64 1108 293 144 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

需要帮忙!

c++
2个回答
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
投票

当你删除一个不应该发生的元素时,你也会在每次迭代中增加i(因为这最终会跳过一些包含128的向量。更具体地说,它会跳过第2,第4,第6个连续出现 - 就像它一样)。请改用:

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++的增量,只有在没有元素被删除时才会完成。

© www.soinside.com 2019 - 2024. All rights reserved.