0

我想检查一个向量,如果它的元素同时具有整数 A 和 B,删除它们之间的元素并复制到另一个向量。例如,有两个向量;vector<> pathvector<> v1

   Path         v1

---A***B##    ---AB## 

所以任务是删除 A 和 B 之间的元素,这是一个 C++ 代码,但不幸的是它不起作用。有什么想法吗?

vector< > Path,v1;

vector<int>::iterator it2,it3;  

int A,B;

it2=find(Path.begin(), Path.end(), A) ; 
it3=find(Path.begin(), Path.end(), B) ; 



vector<int> v1(Path.begin(),Path.end());

if (it2 != Path.end() && it3 != Path.end()) 
{


  if(it2<it3)
  {
     v1.erase(it2+1,it3);
  }
  else
  {
    v1.erase(it3+1,it2);
  }

}
4

2 回答 2

4

首先,您正在v1if 块中创建一个新的,但我很确定您想要分配给已经存在的那个。您还将迭代器从Path向量传递给 的擦除函数v1,从而导致未定义的行为。我还将v1.erase通过不首先添加不需要的元素来保存所做的工作。

if (it2 != Path.end() && it3 != Path.end()) 
{
    if(it3<it2)
    {
        std::swap(it2,it3);
    }

    ++it2; // simplifies logic later

    // optional step to possibly save an allocation
    size_t total = std::distance(Path.begin(), it2);
    total += std::distance(it3,Path.end());
    v1.reserve(total);

    v1.assign(Path.begin(), it2);
    v1.insert(v1.end(), it3, Path.end());
}

请注意,如果A==B,这会将该元素添加两次。我不确定这是否是所需的行为,但它符合您的问题描述。

于 2013-10-20T17:54:11.360 回答
1

首先,不需要从向量开始遍历两次,而不是使用两次算法 std::find 您可以使用算法 std::find_first_of 和 std::find 的组合

例如

int a[] = { A, B }; // where A and B some integer values

std::vector<int>::iterator first, last;
first = last = path.end();

first = std::find_first_of( path.begin(), path.end(), std::begin( a ), std::end( a ) );
if ( first != path.end() )
{
    last = std::find( std::next( first ), path.end(), *first == a[0] ? a[1] : a[0] );
}

现在要移动给定范围内的元素,您可以编写

std::vector<int> v1;
if ( first != path.end() && last != path.end() )
{
    ++first;
    v1.assign( first, last );
    path.erase( first, last );
}

或者如果原始向量不应改变,那么你可以写

std::vector<int> v1;
if ( first != path.end() && last != path.end() )
{
    ++first;
    v1.assign( path.begin(), first );
    v1.insert( v1.end(), last, path.end() );
}
于 2013-10-20T19:11:06.093 回答