سؤال

وأريد أن تحول عناصر داخل حاوية على أي المواقف إلى اليسار أو اليمين. عناصر التحول غير متجاورة.

وعلى سبيل المثال لدي ناقلات {1،2،3،4،5،6،7،8} وأريد أن التحول {4،5،7} إلى اليسار على 2 المواقف، فإن النتيجة المتوقعة ستكون { 1،4،5،2،7،3،6،8}

هل هناك طريقة أنيقة لحلها؟

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

المحلول

ويمكنك كتابة وظيفة التحول الخاصة بك. وهنا واحد بسيط:

#include <iterator>
#include <algorithm>

template <typename Container, typename ValueType, typename Distance>
void shift(Container &c, const ValueType &value, Distance shifting)
{
    typedef typename Container::iterator Iter;

    // Here I assumed that you shift elements denoted by their values;
    // if you have their indexes, you can use advance
    Iter it = find(c.begin(), c.end(), value);
    Iter tmp = it;

    advance(it, shifting);

    c.erase(tmp);

    c.insert(it, 1, value);
}

ويمكنك بعد ذلك استخدام هذا القبيل:

vector<int> v;
// fill vector to, say, {1,2,3,4,5}
shift(v, 4, -2); // v = {1,4,2,3,5}
shift(v, 3, 1); // v = {1,4,2,5,3}

وهذا هو تطبيق السذاجة، لأنه عندما نقل عناصر متعددة، سوف find أعاد عدة مرات في بداية الحاوية. وعلاوة على ذلك، فإنه يفترض أن كل عنصر فريد من نوعه، والتي قد لا يكون الأمر كذلك. ومع ذلك، وآمل أن أعطاك بعض التلميحات حول كيفية تنفيذ ما تحتاجه.

نصائح أخرى

لا يمكن أن تفعل إدراج بسيط ومن ثم محو؟

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

وHTH

والهتافات،

وروب

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