2013-01-05 15 views
6

मेरे पास दो वैक्टर हैं। और मुझे vector1 से हटने की जरूरत है वेक्टर 2 में क्या है। मैं दृश्य स्टूडियो का उपयोग 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

+0

आपके द्वारा लिंक किए गए फ़ंक्शन (2 डी वेक्टर पदार्थ), और आप क्या चाहते हैं (अंतर अंतर, या तत्व-वार संख्यात्मक प्रतिस्थापन) के बारे में एक गंभीर गलतफहमी प्रतीत होती है। जो यह है? – Timbo

+0

@ टिम्बो: "मुझे वेक्टर 1 में क्या है विक्टर 2 में निकालना है"। यह अंतर है, कोई गलतफहमी नहीं है। –

उत्तर

17

आप std::set_difference उपयोग करना चाहिए: http://en.cppreference.com/w/cpp/algorithm/set_difference

सबसे पहले आप के बाद से set_difference संचालित पर पर्वतमाला अनुसार क्रमबद्ध, sort अपने vectors की आवश्यकता होगी। यही है, जब तक वे क्रमबद्ध नहीं हैं (जैसे आपके उपयोग मामले में)।

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) 
); 

यह difference को उन तत्वों vector1 में पाया गया कि vector2 में नहीं पाए जाते संलग्न कर देगा।

+7

@ टिनक्टरियस: कृपया मेरी पोस्ट को संपादित करना बंद करें। 'std :: set_difference' _.NET ढांचे _ ** से ** ** नहीं है। –

1

आप 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();              
    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();                       
    } 
} 

यह a से सभी मूल्यों कि b में हैं मिटा देगा।

गुड लक

0

मैं था 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; 
} 
3

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

चौथा तर्क परिणाम की जगह है। यह भी काम करना चाहिए भले ही वैक्टर का आकार अलग हो।

संबंधित मुद्दे