删除某些位置以外的特定位置的元素

时间:2014-09-29 08:27:17

标签: c++ visual-c++ vector

我知道如何从指定位置擦除c ++向量元素。假设我有向量A = [0 1 0 1 1 0 0 1]。我想删除4个位置中的元素,位置存储在向量B = [1 4 7 8]中。我可以这样做:

 sort (B.begin(), B.end());
 for(int i=B.size() - 1; i >= 0; i--){
       A.erase(A.begin() + B[i]);
     }

问题:我有向量C = [3 4]。向量C的大小总是小于B的大小。现在我必须擦除A中的B.size()元素,如上面的代码所示。这里的条件是如果B的任何索引与C的索引相同,则应该改变B的索引,使得B的索引都不与C相同。这意味着B的索引可以改变,但是大小应该是一样的。对于这种情况,B的索引可以是B = [1 2 7 8]。现在B的索引不包含C的索引,我可以应用上面的代码。

有谁能建议我怎么做到这个?

1 个答案:

答案 0 :(得分:0)

这是一次尝试:

#include <random>       // std::mt19937, std::uniform_int_distribution
#include <algorithm>    // std::set_difference, std::sort
#include <vector>       // std::vector

//Generate a random number called here rdmNb using <random>
//std::mt19937 gen(seed);
//std::uniform_int_distribution<int> rdmNb(0, A.size-1));

int main ()
{

//Data initialization (using C++11)
std::vector<int> vA = {0, 1, 0, 1, 1, 0, 0, 1};
std::vector<int> vB = { 1, 2, 7, 8};
std::vector<int> vC = {3, 4};
int rdmNb=1; //just so it compiles (replace by the random generator function)

//Code
std::vector<int> vD(vB.size(),-1);
std::vector<int>::iterator endIt;

std::sort (vB.begin(), vB.end());
std::sort (vC.begin(), vC.end());

do {
    endIt = std::set_difference (vB.begin(), vB.end(),vC.begin(), vC.end(), vD.begin() );
    for (std::vector<int>::iterator it(endIt); it< vD.end(); it++) {
        *it = rdmNb;
        vB = vD;
    }
} while (*(dD.end()-1)==0); //while (endIt!=vD.end());

//Your normal code:
for(int i=vD.size() - 1; i >= 0; i--){
    vA.erase(vA.begin() + vD[i]);
}

return 0;
}