对矢量的考虑

时间:2014-06-25 11:06:51

标签: c++ c++11 vector

我有两个向量:locs_current_all和sc_current_peaks_pos(两者都填充了位置值),一些元素是共同的。 在vector sc_current_peaks_pos中,我想从矢量sc_current_peaks_pos中删除索引。

所以这是我的代码。

第一种方法:尝试在向量中复制non_short_circuit_current只有不同的元素 locs_current_all和sc_current_peaks_pos。

vector<int> non_short_circuits_current;
int j_nsc=0;
for(int i=0;i<=sc_current_peaks_pos.size()-1;i++){

    for(int k=j_nsc;k<=locs_current_all.size()-1;k++){
        j_nsc++;
        if(sc_current_peaks_pos[i]==locs_current_all[k])
            non_short_circuits_current.push_back(locs_current_all[k]);

           //else break ;

    }

}

第二种方法:从矢量locs_current_all中删除sc_current_peaks_pos中的元素。

vector<int> non_short_circuits_current;
std::for_each(std::begin(sc_current_peaks_pos), std::end(sc_current_peaks_pos), [&](int indexOpp){
 non_short_circuits_current.erase(locs_current_all [indexOpp]);
 });// erase wants more parameters!!!

这两种方法都失败了。 在此先感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

如果我已正确理解您的任务,请尝试类似的

#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdlib>
#include <ctime>


int main() 
{
    const int N = 20;
    std::srand( ( unsigned )std::time( 0 ) );

    std::vector<int> v1( N );
    std::vector<int> v2( N );

    std::generate( v1.begin(), v1.end(), [] { return std::rand() % N; } );
    std::generate( v2.begin(), v2.end(), [] { return std::rand() % N; } );

    for ( int x : v1 ) std::cout << x << ' ';
    std::cout << std::endl;

    for ( int x : v2 ) std::cout << x << ' ';
    std::cout << std::endl;

    auto is_present = [&]( int x )
    { 
        return std::find( v2.begin(), v2.end(), x ) != v2.end();
    };

    v1.erase( std::remove_if( v1.begin(), v1.end(), is_present ), v1.end() );

    for ( int x : v1 ) std::cout << x << ' ';
    std::cout << std::endl;

    for ( int x : v2 ) std::cout << x << ' ';
    std::cout << std::endl;

    return 0;
}

输出

15 4 9 9 11 13 14 16 19 5 6 14 11 2 5 0 6 0 9 12 
16 18 5 14 10 1 5 1 19 18 10 15 2 19 4 5 4 10 13 16 
9 9 11 6 11 0 6 0 9 12 
16 18 5 14 10 1 5 1 19 18 10 15 2 19 4 5 4 10 13 16 

编辑:如果向量排序,那么您可以使用std::binary_search,而不是std::find,因为它在我的样本中使用。

答案 1 :(得分:0)

我正忙着回答这个问题而且我的网络连接已经死了,所以我不打算再发布任何代码示例,之前的答案有一些很好的代码供你使用;但我认为值得注意的是:

  • std::remove()不会从容器中删除或删除元素它只会移动容器中的元素。
  • vector.erase()删除容器中的元素,因为容器本身将有足够的知识从自身中删除元素(即因为这在容器之间有所不同,所以方法必须是成员)。
  • 一旦向量中的元素被擦除(或插入),它可能会使您可能已经创建的迭代器的任何副本无效,因此通常认为所有的无效并重新获取它们是一个好主意(除非你绝对相信它们仍然有效)。基本上,如果您从vec.begin()循环到vec.end()并且在循环结束之前擦除元素,那么您已经遇到了麻烦。
  • “擦除删除”pattern在删除向量中的元素时相当常见,当然您需要定义自定义条件才能删除。
  • 如果它们是已排序的序列,std库可能已经有一些您可能想要使用的算法。