"السليم" طريقة لتخزين البيانات الثنائية مع C++/STL

StackOverflow https://stackoverflow.com/questions/441203

  •  22-07-2019
  •  | 
  •  

سؤال

بشكل عام ، ما هي أفضل طريقة تخزين البيانات الثنائية في C++?خيارات ، بقدر ما يمكنني أن أقول ، إلى حد كبير تختزل إلى استخدام السلاسل أو ناقلات<char>s.(سأقوم بحذف إمكانية char*s و malloc()s أنا منذ مشيرا على وجه التحديد إلى C++).

عادة أنا فقط استخدام سلسلة, ومع ذلك أنا لست متأكدا مما إذا كان هناك النفقات العامة أنا في عداد المفقودين ، أو تحويلات الخاصة بلبنان داخليا يمكن أن تعبث مع التعقل من البيانات الثنائية.لا أحد لديه أي مؤشرات (هار) على هذا ؟ اقتراحات أو تفضيلات بطريقة أو بأخرى ؟

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

المحلول

ناقلات شار جميل لأن الذاكرة contiguious.لذلك يمكنك استخدامه مع الكثير من C API مثل بيركلي مآخذ أو ملف واجهات برمجة التطبيقات.يمكنك القيام بما يلي على سبيل المثال:

  std::vector<char> vect;
  ...
  send(sock, &vect[0], vect.size());

وسوف تعمل بشكل جيد.

يمكنك أساسا التعامل معها تماما مثل أي دولة أخرى تخصيصها شار العازلة.يمكنك مسح صعودا وهبوطا تبحث عن الأرقام السحرية أو أنماط.يمكنك تحليل ذلك جزئيا في المكان.تلقي من مأخذ يمكنك بسهولة جدا حجمه إلى إلحاق المزيد من البيانات.

الجانب السلبي هو حجم هو ليس بشكل رهيب كفاءة (تغيير حجم أو preallocate بحكمة) و الحذف من أمام مجموعة كما سيتم جدا ineficient.إذا كنت بحاجة إلى البوب واحد أو اثنين فقط حرف في وقت قبالة الجزء الأمامي من هيكل البيانات بشكل متكرر جدا ، نسخ إلى deque قبل هذه المعالجة قد يكون خيارا.هذه التكاليف لك نسخة deque الذاكرة ليست متجاورة ، لذلك لا يمكنك فقط تمرير مؤشر إلى C API.

خلاصة القول, التعلم عن هياكل البيانات و المفاضلات قبل الغوص في ذلك ناقلات شار عادة ما أرى المستخدمة في الممارسة العامة.

نصائح أخرى

وأكبر مشكلة مع الأمراض المنقولة جنسيا :: السلسلة أن المعيار الحالي لا يضمن أن التخزين الأساسي هو متجاورة. ومع ذلك، لا توجد تطبيقات STL المعروفة حيث لم يكن السلسلة متجاورة، وذلك في واقع الامر انه ربما لن تفشل. في الواقع، والمعيار C ++ 0X الجديد سوف إصلاح هذه المشكلة، تكليفها أن الأمراض المنقولة جنسيا :: سلسلة يستخدم عازلة متجاورة، مثل الأمراض المنقولة جنسيا :: ناقلات.

وحجة أخرى ضد السلسلة أن اسمها يشير إلى أنه يحتوي على سلسلة أحرف، وليس عازلة ثنائي، مما قد يسبب الارتباك للذين قراءة التعليمات البرمجية.

وقال ذلك، فإنني أوصي ناقلات أيضا.

وأنا استخدم std::string لهذا أيضا، ولم يكن لديه مشكلة في ذلك.

و"المؤشر،" واحد التي تلقيتها مجرد تذكير حاد في قطعة من التعليمات البرمجية أمس: عند إنشاء سلسلة من كتلة من البيانات الثنائية، استخدم النموذج std::string(startIter, endIter) منشئ، وليس على شكل std::string(ptr, offset, length) - هذا الأخير يجعل افتراض أن نقاط مؤشر إلى سلسلة الطراز C، ويتجاهل أي شيء بعد الحرف الصفر الأول (فإنه ينسخ "حتى" في length محدد، وليس length حرفا).

ويجب أن يكون من المؤكد أن استخدام بعض الحاويات من شار، ولكن الحاوية التي تريد استخدامها يعتمد على طلبك.

وأحرف لها العديد من الخصائص التي تجعلها مفيدة لعقد البيانات الثنائية: معيار يرفض أي "الحشو" لنوع البيانات شار، وهو أمر مهم لأنه يعني أنك لن تحصل على القمامة في حياتك تخطيط ثنائي. مكفول لكل شار إلى أن تكون بالضبط بايت واحد، ما يجعل منه نوع البيانات سهل القديمة (POD) مع عرض مجموعة (يتم تحديد جميع الآخرين من حيث الحدود العليا و / أو أقل).

ويتم التعامل مع النقاش حول الحاوية STL المناسبة لتخزين حرف كتبها بشكل جيد من قبل دوغ أعلاه. أي واحد تحتاج يعتمد كليا على حالة استخدامك. إذا كنت مجرد عقد كتلة من البيانات التي تكرار خلال، دون أي بحث خاص، إلحاق / إزالة، أو احتياجات لصق، وأود أن تفضل ناقلات، الأمر الذي يجعل نواياكم أكثر وضوحا من الأمراض المنقولة جنسيا :: السلسلة، والذي العديد من المكتبات وظائف ستتولى حاصل على سلسلة الطراز ج خالية منتهية.

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