سؤال

على افتراض أن لدي مصفوفتين بأحجام مختلفة، على سبيل المثال

int arr[] = {0,1,2,3,4,5,6,7,8,9};
int *arr2 = new int[5];

أريد نسخ ضحل بعضها ، سيكون ما يعادل نسخة عميقة

int j =0;    
if(!(i%2))
    {
        arr2[j]=arr[i];
        j++;
    }

الآن ستخرج نسخة من arr2:0, 2, 4, 6,8

السبب وراء رغبتي في النسخ الضحل هو أنني أريد تحديث arr2 بأي تغييرات تطرأ على arr.

هذا إذا قمت بتكرار جميع العناصر الموجودة في arr وتربيعها

أريد أن يخرج arr2 :0, 4, 16, 36,64

تعد هاتان المصفوفتان جزءًا من نفس الفئة، إحداهما عبارة عن معلومات متعددة الأضلاع، والجزء الآخر يعتمد على البيانات.يبلغ حجم arr في الواقع أكثر من 4000 عنصر، ويقترب حجم arr2 من 3000.في الوقت الحالي، تعمل الخوارزمية الخاصة بي بشكل رائع مع النسخ العميق.ولكن لأنني بحاجة إلى نسخ عميق لـ 3000 عنصر لكل إطار تحديث، فإنني أهدر الموارد وكنت أتساءل عما إذا كان بإمكاني القيام بذلك بطريقة ما عبر نسخة ضحلة حتى لا أضطر إلى تحديث arr2 في كل إطار.بالطريقة التي يحتاجها الكود الخاص بي للعمل، يحتوي arr بالفعل على قيم arr2 المتكررة.arr2 عبارة عن قائمة من النقاط المتحركة.ثم يتم تكرار البيانات إلى arr التي تحتوي على البيانات الموضعية للقمم.وذلك لأن arr يحتوي على عدة تصحيحات بيزير، وبعضها يشترك في حافة واحدة أو أكثر مع تصحيح آخر.لكني أريد أن يتم تجاهل ذلك عند تحريك أي فواصل في السطح.

ومن المهم أن تتضمن النسخة مؤشرات مثل

arr2[j]=arr[i];

لأن هذه هي الطريقة التي يتم بها إعداد الكود الخاص بي.وأن تكون العملية ذات حمل منخفض.

هل كانت مفيدة؟

المحلول

سوف تحتاج إلى مجموعة من المؤشرات الصحيحة لذلك.

int *arr2[5];

for (int i = 0, j = 0; i < 10; i++) {
    if (!(i%2)) {
        arr2[j]= &arr[i];
        j++;
    }
}

لذلك تحتاج إلى تعيين كل عنصر من عناصر arr2 للإشارة إلى العنصر المقابل في arr by arr2[j]= &arr[i];

عندما تحتاج إلى الوصول إلى العنصر في arr2، يمكنك استدعاء شيء مثل: int a = *arr2[j];

لنفترض لاحقًا أنك قمت بتغيير arr[0] إلى 10 arr[0] = 10; ثم int a = *arr2[0]; سوف أعطيك 10.

نصائح أخرى

كبديل لنهج صفيف المؤشر، إليك مثال C++ 03 الخام لكيفية القيام بذلك برمجيًا.أيهما أفضل يعتمد على مدى تعقيده operator[] يجب أن يكون هنا في حالة الاستخدام الحقيقي، ومدى صغر حجم المصفوفة الثانية (على سبيل المثال.مقدار الذاكرة الإضافية التي يحتاجها، مما يتسبب في فقدان ذاكرة التخزين المؤقت وما إلى ذلك).

#include <iostream>

class c_array_view  {
public:
    c_array_view(int *array) : array_(array) {}
    int& operator[](size_t index) { return array_[index*2]; }

    static size_t convert_length(size_t original) { return original / 2; }

private:
    int *array_;
};

int main()
{
    int arr[] = {0,1,2,3,4,5,6,7,8,9};
    size_t arr_len = sizeof arr / sizeof arr[0];

    c_array_view arr2(arr);
    size_t arr2_len = arr2.convert_length(arr_len);

    for(unsigned i = 0; i < arr_len; ++i) {
        std::cout << "arr: " << i << " = " << arr[i] << std::endl;
    }
    std::cout << std::endl;

    for(unsigned j = 0; j < arr2_len; ++j) {
        std::cout << "arr2: " << j << " = " << arr2[j] << std::endl;
    }
    std::cout << std::endl;

    arr2[2] = 42;
    std::cout << "modifeid arr2[2] to 42, now arr[4] = " << arr[4] << std::endl;

    return 0;
}

ال c_array_view يمكن تحويلها إلى قالب، وهي فئة لطيفة للأغراض العامة والتي من شأنها أن تأخذ وظيفة التعيين باعتبارها C++ 11 lambda، وما إلى ذلك، وهذا يوضح المبدأ فقط.

إذا كنت تريد المربعات، فلن تقوم بعدم القيام برحلات ARR2 [J]= arr [i].الجواب الصحيح سيكون

giveacodicetagpre.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top