C++:向量减法

9
我有两个向量。我需要从向量1中删除向量2中的内容。
[编辑:不清楚这是否意味着像下面链接中的每个元素减法或集合差异]
我使用Visual Studio 2010。
似乎有一种方法: http://msdn.microsoft.com/en-us/library/system.windows.vector.subtract.aspx 但它似乎不起作用,甚至没有代码示例。
你能帮我吗?如果没有标准方法,也许你可以建议如何通过循环来组织它?提前谢谢。
#include "stdafx.h";
#include <vector>;
#include <iostream>

using namespace std;

int main ()
{
  vector<int> vector1;
  vector<int> vector2;

  for (int i = 0; i < 10; i++)
  {
vector1.push_back (i);
  }

  for (int i = 0; i < 6; i++)
  {
    vector2.push_back (i);
  }

  myvector1 = Subtract(vector1, vector2); 

  return 0;
}

1
你找到的方法是针对.NET的。这意味着如果要在C++中使用它,你需要切换到C++/CLI。 - chris
似乎对于你所链接的函数(2D向量减法)以及你想要的操作(集合差异或逐元素数值减法),存在严重的误解。你需要哪种操作? - Timbo
@Timbo: "我需要从vector1中删除vector2中存在的内容。" 这就是集合差异,没有误解。 - K-ballo
@K-ballo 你可能是对的。然而,很明显链接的方法根本没有做到这一点。 - Timbo
@Timbo:我猜OP只是有些困惑,因为_.Net Vector_是一个几何向量而不是容器,而他显然在使用容器... - K-ballo
5个回答

26

你应该使用std::set_difference: http://en.cppreference.com/w/cpp/algorithm/set_difference

首先,你需要sort你的vectors,因为set_difference只能操作已排序的范围。除非它们已经排序(像在你的用例中一样)。

std::sort(vector1.begin(), vector1.end());
std::sort(vector2.begin(), vector2.end());

那么你可以这样调用它:

std::vector<int> difference;
std::set_difference(
    vector1.begin(), vector1.end(),
    vector2.begin(), vector2.end(),
    std::back_inserter( difference )
);

这将把vector1中不在vector2中的元素附加到difference中。

22

std::transform(vector1.begin(), vector1.end(), vector2.begin(), vector1.begin(), std::minus<int>())

第四个参数是结果的位置,即输出的容器。即使向量的大小不同,该函数也可以正常工作。


10
仅供快速浏览的人作澄清:这是逐个元素的减法,而非集合差异。 - mahasamatman

3

如果你不想使用std::set_difference,你可以这样做:

// substracts b<T> to a<T>
template <typename T>                                                                                            
void
substract_vector(std::vector<T>& a, const std::vector<T>& b)                                                     
{
    typename std::vector<T>::iterator       it = a.begin();
    typename std::vector<T>::const_iterator it2 = b.begin();

    while (it != a.end())
    {
        while (it2 != b.end() && it != a.end())
        {
            if (*it == *it2)
            {
                it = a.erase(it);
                it2 = b.begin();
            }

            else
                ++it2;
        }
        if (it != a.end())
            ++it;

        it2 = b.begin();
    }
}

这将从a中删除所有在b中存在的值。
祝好运。

再次强调,这并没有回答问题。这是执行一个集合差分操作。OP要求的是逐个元素相减。 - Paul Floyd

2
我建议使用EigenVectors,它具有向量的内置算术运算功能: http://eigen.tuxfamily.org/dox-devel/group__TutorialMatrixArithmetic.html 因此,您可以使用像+,-,*,/这样的运算符。
#include <iostream>
#include <Eigen/Dense>
using namespace Eigen;
int main()
{
  Matrix2d a;
  a << 1, 2,
       3, 4;
  MatrixXd b(2,2);
  b << 2, 3,
       1, 4;
  std::cout << "a + b =\n" << a + b << std::endl;
  std::cout << "a - b =\n" << a - b << std::endl;
  std::cout << "Doing a += b;" << std::endl;
  a += b;
  std::cout << "Now a =\n" << a << std::endl;
  Vector3d v(1,2,3);
  Vector3d w(1,0,0);
  std::cout << "-v + w - v =\n" << -v + w - v << std::endl;
}

-9

/最简单的方法/

#include<stdio.h>
main()
{
 int A,B,C;
 printf("enter the two numbers 1st 2nd=");
 scanf("%d",&A);
 scanf("%d",&B);
 C=A-B;
 printf("Result=");
 printf
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接