ผลคูณคาร์ทีเซียนของช่องว่างสองเวกเตอร์

Aug 16 2020

ไม่กี่วันที่ผ่านมาฉันพบปัญหาที่น่าสนใจซึ่งอ่านต่อไปนี้:

เมื่อกำหนดช่องว่างสองเวกเตอร์จะสร้างชุดผลลัพธ์ของผลิตภัณฑ์คาร์ทีเซียน \ เริ่ม {รวบรวม} \ text {ให้:} \ mathcal {V}, \ mathcal {W} \ text {be vector space} \\ \ mathcal {V} \ times \ mathcal {W} = \ {(v, w ) \ mid v \ in \ mathcal {V} \ land w \ in \ mathcal {W} \} \ end {collect}

  • คำแนะนำ 1: ปริภูมิเวกเตอร์คือชุดขององค์ประกอบที่เรียกว่าเวกเตอร์ซึ่งทำให้คุณสมบัติบางอย่างสำเร็จ
  • คำแนะนำ 2: ออกแบบโซลูชันสำหรับช่องว่างแบบ จำกัด เวกเตอร์
  • เคล็ดลับ 1: ขอแนะนำให้ใช้โครงสร้าง
  • ข้อ จำกัด : คุณไม่ได้รับอนุญาตให้ใช้คลาส stl ใด ๆ

ฉันแก้ไขปัญหานี้ด้วยแนวทางถัดไป:

struct vector_pair
{
    double *vector_a;
    double *vector_b;
    size_t a_dimension;
    size_t b_dimension;
};

struct cartesian_product_set
{
    vector_pair *pairs;
    size_t pairs_number;
};

cartesian_product_set vector_spaces_cartesian_product(double **space_v, size_t v_vectors,
    size_t v_dimension, double **space_w, size_t w_vectors, size_t w_dimension)
{
    cartesian_product_set product_set{new vector_pair[v_vectors * w_vectors], v_vectors * w_vectors};
    
    for (size_t i = 0, j, k = 0; i < v_vectors; i++)
        for (j = 0; j < w_vectors; j++)
            product_set.pairs[k++] = vector_pair{space_v[i], space_w[j], v_dimension, w_dimension};

    return product_set;
}

ฉันจะปรับปรุงโค้ดนี้ได้อย่างไรหากทำได้

ขอบคุณ.

คำตอบ

2 cauon Aug 18 2020 at 15:28
  1. const- ความถูกต้อง
  2. ใช้การอ้างอิงเพื่อสนับสนุนตัวชี้หากเป็นไปได้
  3. การที่คุณทิ้งภาระหน้าที่ในการปลดปล่อยหน่วยความจำที่คุณจัดสรรให้กับผู้โทรโดยทั่วไปไม่ใช่แนวทางปฏิบัติที่ดี
  4. รูปแบบทั่วไปในโค้ดของคุณคือคุณมีพอยน์เตอร์ไปยังอาร์เรย์และความยาว - ทำไมไม่สร้างโครงสร้างเพื่อรวมเข้าด้วยกัน?
  5. พยายามใช้ตัวทำซ้ำและ range-based-for-loops เมื่อคุณไม่ต้องการดัชนีจริงๆ (ซึ่งคุณไม่ได้อยู่ในตัวอย่าง)
  6. เนื่องจากเราไม่ค่อยสนใจเกี่ยวกับประเภทขององค์ประกอบในพื้นที่เวกเตอร์คุณสามารถใช้เทมเพลตเพื่อสรุปอัลกอริทึมของคุณได้

และเพื่อดูว่าจะเป็นไปได้หรือไม่ฉันพยายามสร้างอัลกอริทึมรุ่นเวลาคอมไพล์:

template<typename T>
struct pair
{
    T first;
    T second;
};

template<std::size_t N, typename T>
struct cvp
{
    pair<T> pairs[N];
};

template <typename T, size_t NV, size_t NW>
auto get_cvp(const T (&vs)[NV], const T (&ws)[NW])
{
    cvp<NV*NW, T> result;
    auto it_pairs = std::begin(result.pairs);
    for (const auto v : vs) {
        for (const auto w : ws) {
            *(it_pairs++) = {v, w};
        }
    }
    return result;
}

คุณสามารถลองใช้รหัสได้ที่นี่: https://godbolt.org/z/e8GvEf