2012-11-26 14 views
6

पर कॉपी कैसे कर सकता हूं, मैंने डेटा स्टोर करने के लिए सरणी का उपयोग किया था, लेकिन मैंने वेक्टर के साथ प्रतिस्थापित किया, इसलिए मैं सभी सी ऑपरेटरों को सी ++ ऑपरेटरों के साथ बदलना चाहता हूं। मैं एक स्मृति ब्लॉकमैं एक वेक्टर ब्लॉक को अन्य

for (i = 0; i < rows_; i++) 
    memcpy((T *) &tmp.data_[cols_ * i], (T *) &a.data_[cols_ * (2 * i + 1)], rows_ * sizeof(T)); 

यह भी वैक्टर के साथ काम कर रहा है कॉपी करने के लिए memcpy इस्तेमाल किया, मैं सिर्फ जानना चाहता हूँ वहाँ ग में एक समान कार्य है ++?

std::copy(tmp.data_[cols_ * i], tmp.data_[cols_ * i+rows], a.data_[cols_ * (2 * i + 1)]); 

लेकिन मैं निम्न त्रुटि प्राप्त कर रहा हूँ:

error: invalid use of member function (did you forget the ‘()’ ?) 

उदाहरण के लिए:

मैं एक 2xnxn आकार सरणी है और मैं उपयोग कर रहा हूँ

मैं नकल करने की कोशिश की इसके बजाय एक nxn सरणी बनाने के लिए चक्र के लिए। उदाहरण के लिए मेरे पास 1 2 3 4 5 6 7 8 है, मेरी नई सरणी निम्नलिखित है: 3 4 7 8. मैंने इसे प्राप्त करने के लिए memcpy का उपयोग किया, लेकिन मुझे नहीं पता कि मैं C++

+2

क्या आपने ['std :: copy'] (http://www.cplusplus.com/reference/algorithm/copy/) की कोशिश की है? – WhozCraig

+2

'std :: copy'। वास्तव में आपको इसका उपयोग सरणी के साथ भी करना चाहिए। – Yuushi

+0

हां मैंने कोशिश की: std :: copy (tmp.data_ [cols_ * i], tmp.data_ [cols_ * i + पंक्तियां], a.data_ [cols_ * (2 * i + 1)]); –

उत्तर

3

उपयोग std::copy या std::vector::assign अगर आप array से vector

int from_array[10] = {1,2,3,4,5,6,7,8,9,10}; 

    std::vector<int> to_vector; 

    int array_len = sizeof(from_array)/sizeof(int); 
    to_vector.reserve(array_len); 
    std::copy(from_array, from_array+10, std::back_inserter(to_vector)); 
    or C++11 
    std::copy(std::begin(from_array), std::end(from_array), std::back_inserter(to_vector)); 

    std::vector<int> to_vector2; 
    to_vector2.reserve(array_len); 
    to_vector2.assign(from_array, from_array + array_len); 

को कॉपी करता है, तो वेक्टर से प्रति सदिश को

std::vector<int> v1; 
    std::vector<int> v2; 
    v2 = v1; // assign operator = should work 

अगर आप v1 रखने की जरूरत नहीं है, std::swap भी काम करता है

v2.swap(v1); 

अपडेट:

const int M = 2; 
    const int N = 4; 
    int from_array[M][N] = {{1,2,3,4},{5,6,7,8}}; 

    std::vector<int> to_vector; 
    to_vector.reserve(N); 
    int start=2; 
    int end = 4; 
    for (int i=0; i<M; i++) 
    { 
    std::copy(from_array[i]+start, from_array[i]+end, std::back_inserter(to_vector)); 
    } 
+0

का उपयोग करें मेरे पास 2xnxn आकार सरणी है और मैं इसके बजाय एक nxn सरणी बनाने के लिए चक्र का उपयोग कर रहा हूं। उदाहरण के लिए मेरे पास 1 2 3 4 5 6 7 8 है, मेरी नई सरणी निम्नलिखित है: 3 4 7 8. मैंने इसे प्राप्त करने के लिए memcpy का उपयोग किया, लेकिन मुझे नहीं पता कि मैं C++ –

+0

@iUngi में कैसे प्राप्त कर सकता हूं, मेरा अद्यतन उत्तर देखें, क्या आप चाहते हैं? – billz

4

में कैसे प्राप्त कर सकता हूं एक मानक एल्गोरिदम copy है। यह memcpy से सुरक्षित है क्योंकि यह गैर-पीओडी प्रकारों के लिए भी काम करता है। यह कभी-कभी पीओडी प्रकारों के लिए अनुकूलित किया जाता है जिसके परिणामस्वरूप memcpy होता है। आप आमतौर पर मानक एल्गोरिदम के साथ पॉइंटर्स का उपयोग नहीं करते हैं, लेकिन आपको iterators का उपयोग करना होगा। एक इटेटरेटर प्राप्त करने के लिए आप begin() और end() विधियों या निःशुल्क फ़ंक्शंस का उपयोग करें। उदाहरण:

vector<int> a(10, 5); 
vector<int> b(5); 

copy(a.begin(), a.begin()+5, b.begin()); 
+1

'वेक्टर :: असाइन' भी है। –

3

खैर, std::vector देशी operator=() जो एक से दूसरे वेक्टर सामग्री कॉपी करने के लिए इस्तेमाल किया जा सकता है:

std::vector<T> x; 
std::vector<T> y; 
y = x; 

वहाँ भी std::copy जो iterators साथ काम करता है और सरणी की नकल की स्लाइस के लिए अनुमति देता है।

+0

ऑपरेटर =() मेरे लिए अच्छा नहीं है क्योंकि मैं सरणी ब्लॉक –

+0

पुनर्गठन कर रहा हूं फिर 'std :: copy' – mvp

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