Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C++ में mutable कीवर्ड


mutable कीवर्ड क्या है?

Mutable डेटा सदस्य वे सदस्य हैं जिनके मान रनटाइम पर बदले जा सकते हैं भले ही ऑब्जेक्ट कॉन्स्टेंट टाइप का हो। यह कॉन्स्टेंट के बिल्कुल विपरीत है।

कभी-कभी लॉजिक के लिए केवल एक या दो डेटा सदस्यों को वेरिएबल के रूप में और दूसरे को कॉन्स्टेंट के रूप में उपयोग करने की आवश्यकता होती है ताकि डेटा को हैंडल किया जा सके। उस स्थिति में, म्यूटेबिलिटी क्लासेस को प्रबंधित करने के लिए बहुत उपयोगी अवधारणा है।

उदाहरण

#include <iostream>
using namespace std;

class Test {
public:
    int a;
    mutable int b;  // mutable कीवर्ड

    Test(int x = 0, int y = 0) {
        a = x;
        b = y;
    }

    void seta(int x = 0) {
        a = x;
    }

    void setb(int y = 0) {
        b = y;
    }

    void disp() {
        cout << endl << "a: " << a << " b: " << b << endl;
    }
};

int main() {
    const Test t(10, 20);  // कॉन्स्ट ऑब्जेक्ट
    cout << t.a << " " << t.b << "\n";

    // t.a = 30; // एरर: a को बदला नहीं जा सकता, क्योंकि ऑब्जेक्ट कॉन्स्ट है
    t.b = 100;  // b अभी भी बदला जा सकता है, क्योंकि b mutable है

    cout << t.a << " " << t.b << "\n";
    return 0;
}

आउटपुट

10 20
10 100

व्याख्या

  • const Test t(10, 20) एक कॉन्स्ट ऑब्जेक्ट बनाता है
  • t.a = 30 कंपाइल एरर देगा क्योंकि a mutable नहीं है
  • t.b = 100 काम करता है क्योंकि b को mutable घोषित किया गया है

mutable का उपयोग कब करें

  • कैशिंग: कॉन्स्ट मेथड में महंगी गणना का परिणाम कैश करना
  • म्यूटेक्स/लॉक्स: कॉन्स्ट मेथड में थ्रेड सेफ्टी के लिए म्यूटेक्स लॉक करना
  • लॉगिंग/डीबगिंग: कॉन्स्ट ऑब्जेक्ट में लॉग काउंटर अपडेट करना
  • लेजी इनिशियलाइज़ेशन: पहली बार एक्सेस पर डेटा इनिशियलाइज़ करना

व्यावहारिक उदाहरण: कैशिंग

class ExpensiveCalculation {
    mutable int cachedResult;
    mutable bool isCached;

public:
    ExpensiveCalculation() : cachedResult(0), isCached(false) {}

    int getResult() const {
        if (!isCached) {
            // महंगी गणना
            cachedResult = computeExpensive();
            isCached = true;
        }
        return cachedResult;
    }

private:
    int computeExpensive() const {
        // सिमुलेटेड महंगी गणना
        return 42;
    }
};

सावधानियां

  • mutable का उपयोग सावधानी से करें - यह कॉन्स्ट सहीता (const correctness) को तोड़ सकता है
  • केवल उन सदस्यों के लिए उपयोग करें जो ऑब्जेक्ट की "लॉजिकल कॉन्स्टनेस" को प्रभावित नहीं करते
  • थ्रेड-सेफ्टी पर विचार करें यदि mutable सदस्यों को मल्टीथ्रेडेड संदर्भ में एक्सेस किया जाता है
  1. C++ में डायगोनल ट्रैवर्स II C++ में डायगोनल ट्रैवर्स II

    मान लीजिए हमारे पास nums नामक लिस्ट ऑफ लिस्ट है, हमें nums के सभी एलिमेंट्स को डायगोनल क्रम में दिखाना है।इसलिए, यदि इनपुट हैतो आउटपुट होगा [1,6,2,8,7,3,9,4,12,10,5,13,11,14,15,16]इसे हल करने के लिए, हम निम्न चरणों का पालन करेंगे:एक ऐरे ret परिभाषित करेंएक 2D ऐरे v परिभाषित करेंi := 0 से शुरू करें,

  1. C++ में प्रोसेस मारें C++ में प्रोसेस मारें

    मान लीजिए हमारे पास n प्रोसेस हैं, यहां प्रत्येक प्रोसेस की एक अद्वितीय आईडी होती है जिसे PID या प्रोसेस आईडी कहा जाता है और इसका PPID (पैरेंट प्रोसेस आईडी) भी होता है। प्रत्येक प्रोसेस का केवल एक पैरेंट प्रोसेस होता है, लेकिन उसके एक या अधिक चाइल्ड प्रोसेस हो सकते हैं। यह एक ट्री संरचना की तरह है।

  1. C++ में गिलहरी सिमुलेशन C++ में गिलहरी सिमुलेशन

    एक पेड़, एक गिलहरी, और कई नट्स हैं। स्थितियों को 2D ग्रिड में सेल द्वारा दर्शाया जाता है। आपका लक्ष्य गिलहरी के लिए सभी नट्स को इकट्ठा करके उन्हें एक-एक करके पेड़ के नीचे रखने के लिए न्यूनतम दूरी ढूंढना है। गिलहरी एक समय में अधिकतम एक नट ले जा सकती है और चार दिशाओं में आगे बढ़ सकती है - ऊपर, नीचे,