2013-04-14 3 views
1

Я не был уверен, о названии вопроса, но вот в чем проблема.Сохранение только нескольких изменений в структуре данных

У меня есть массив структур, теперь я передаю его ссылкой на функцию, где in, у меня есть очередь приоритета, из тех же структур.

Теперь я обрабатываю свой массив, используя очередь приоритетов, и в конце процесса у меня будет два атрибута (скажем A и B) моей структуры, в массиве изменено, в то время как я хотите, чтобы только одно из изменений (A) отражалось вне функции, и я хочу, чтобы другое (B) изменение было восстановлено, как это было до передачи массива. Я должен это сделать, потому что во второй раз, когда мне приходится обрабатывать один и тот же массив, но с разными параметрами, я хочу, чтобы изменения A оставались, а B - нет.

Что я делаю прямо сейчас, то после процесса, когда я вышел из функции, я обрабатываю весь массив и где когда-либо меняет значение для атрибута B, я возвращаю его обратно к исходному значению. Теперь это, очевидно, операция O (n2), которая мне не подходит.

Могу ли я сделать что-то, чтобы сделать его более эффективным.

Я работаю с C.

+0

Пропускает массив структур по значению, а не по ссылке. Пусть платформа DOT NET выполнит вашу работу. –

+1

Когда вы говорите O (n2), вы имеете в виду n-квадрат или n-раз-два? –

ответ

1

Если B имеет тип bool, например, вы можете создать bool массив в функции. Используйте индексы входного массива (целые числа) в очереди приоритетов вместо структур. Используйте bool массив для доступа к B S входного массива:

void func(Type *Input, size_t n) 
{ 
    bool B[n]; 
    queue<size_t> pqueue; 
    for (size_t i = 0; i < n; i++) 
     B[i] = Input[i].B; 
    size_t index; 
    while (index = pqueue.front()) { 
     // do something with Input[index] 
     // B[index] = false; 
     // rest of the function 
    } 
} 
+1

в основном, скопируйте все атрибуты B в другой массив и используйте это вместо структуры, когда это необходимо. – Kraken

Смежные вопросы