मान लें कि मेरे पास सी पुस्तकालय एपीआई फ़ंक्शन है जो पॉइंटर्स के पैरामीटर के रूप में पॉइंटर लेता है। हालांकि जब से मैं सी ++ में प्रोग्रामिंग कर रहा हूं, मैं गतिशील स्मृति से निपटने के लिए स्टडी वेक्टर का लाभ लेना चाहता हूं। मैं पॉइंटर के सूचक में वेक्टर के वेक्टर को कुशलतापूर्वक कैसे परिवर्तित कर सकता हूं? अभी मैं इसका उपयोग कर रहा हूँ।पॉइंटर
#include <vector>
/* C like api */
void foo(short **psPtr, const int x, const int y);
int main()
{
const int x = 2, y = 3;
std::vector<std::vector<short>> vvsVec(x, std::vector<short>(y, 0));
short **psPtr = new short*[x];
/* point psPtr to the vector */
int c = 0;
for (auto &vsVec : vvsVec)
psPtr[c++] = &vsVec[0];
/* api call */
foo(psPtr, x, y);
delete[] psPtr;
return 0;
}
क्या यह लक्ष्य प्राप्त करने का सबसे अच्छा तरीका है? क्या मैं इस मामले में इटरेटर या कुछ std विधि का उपयोग करके "नई हटाएं" चीज़ से छुटकारा पा सकता हूं? अग्रिम में धन्यवाद।
संपादित करें: उत्तर के अनुसार अब मैं इस संस्करण का उपयोग सी कोड के साथ इंटरफेस करने के लिए कर रहा हूं। मैं इसे यहां पोस्ट कर रहा हूं।
#include <vector>
/* C like api */
void foo(short **psPtr, const int x, const int y);
int main()
{
const int x = 2, y = 3;
std::vector<std::vector<short>> vvsVec(x, std::vector<short>(y, 0));
std::vector<short*> vpsPtr(x, nullptr);
/* point vpsPtr to the vector */
int c = 0;
for (auto &vsVec : vvsVec)
vpsPtr[c++] = vsVec.data();
/* api call */
foo(vpsPtr.data(), x, y);
return 0;
}
मेरे जैसे अधिक सी ++ दिखता है। सबको धन्यवाद!
ड्रॉप एक वेक्टर के स्तर और उस फ्लैट वेक्टर के पहले तत्व के लिए सूचक का पता ले। – rubenvb
केवल इसे अच्छी लगती है, आप एक सदिश के साथ psPtr को प्रतिस्थापित कर सकते हैं, और इसे एल्गोरिदम में कुछ फ़ंक्शन के साथ सेट कर सकते हैं। –
BlueWanderer
एपीआई फ़ंक्शन को या तो आकार पैरामीटर की आवश्यकता होती है या यह सम्मेलन है कि एक शून्य सूचक अंतिम तत्व को इंगित करता है, इस स्थिति में आपको अंत में 'nullptr' जोड़ना होगा। –