2013-01-05 39 views
6

Tôi có hai vectơ. Và tôi cần phải loại bỏ từ vector1 những gì có trong vector2. tôi sử dụng Visual Studio 2010.C++: trừ các vectơ

Có vẻ là một phương pháp: http://msdn.microsoft.com/en-us/library/system.windows.vector.subtract.aspx

Nhưng bằng cách nào đó không làm việc và thậm chí không có mã ví dụ.

Bạn có thể giúp tôi không? Nếu không có phương pháp chuẩn nào tồn tại, có thể bạn có thể đề xuất cách tổ chức nó thông qua các vòng lặp? Cảm ơn bạn trước.

#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

Phương pháp bạn tìm thấy là dành cho .NET. Điều đó có nghĩa là để sử dụng nó với C++, bạn phải chuyển sang C++/CLI. – chris

+0

Có vẻ như có một sự hiểu lầm nghiêm trọng về chức năng mà bạn liên kết làm (chất nền vector 2d), và những gì bạn có thể muốn (thiết lập sự khác biệt, hoặc phần tử số nguyên tố). Đó là nó? – Timbo

+0

@Timbo: "Tôi cần phải xóa khỏi vector1 những gì có trong vector2". Đó là sự khác biệt thiết lập, không có sự hiểu lầm. –

Trả lời

17

Bạn nên sử dụng std::set_difference: http://en.cppreference.com/w/cpp/algorithm/set_difference

Trước tiên, bạn sẽ cần phải sortvectors của bạn, vì set_difference hoạt động trên sắp xếp dãy. Tức là, trừ khi chúng được sắp xếp đã có (như trong trường hợp sử dụng của bạn).

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

Sau đó, bạn gọi nó là như thế này:

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

này sẽ nối để difference những yếu tố được tìm thấy trong vector1 không được tìm thấy trong vector2.

+7

@Tinctorius: Vui lòng ngừng chỉnh sửa bài đăng của tôi. 'std :: set_difference' là ** không ** từ khung _.NET _... –

1

Nếu bạn không muốn sử dụng std::set_difference, bạn có thể làm điều này:

// 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();              
    typename std::vector<T>::iterator  end = a.end();               
    typename std::vector<T>::const_iterator end2 = b.end();              

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

này sẽ xóa từ a tất cả các giá trị có trong b.

Chúc may mắn

0

tôi muốn đề nghị chuyển sang vector riêng đã được xây dựng trong phép tính số học cho vectơ:

http://eigen.tuxfamily.org/dox-devel/group__TutorialMatrixArithmetic.html

Vì vậy, bạn có thể sử dụng các toán như +, -, *,/

#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; 
} 
3

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

Đối số thứ 4 là vị trí của kết quả. Nó sẽ hoạt động ngay cả khi kích thước của vectơ khác nhau.

Các vấn đề liên quan