2013-09-06 4 views
0

У меня есть довольно простое/очевидное решение итератора, но я подумал, что я коснусь SO, чтобы узнать, появляется ли кто-нибудь из одного из редких замечательных рецептов, которые возникают в ответах здесь :)конвертировать вектор из нескольких векторов int в массив int

ситуация следующая:

  • нескольких векторов междунар известных и доступных размеров, в настоящее время прятали в vector<vector<int>>, не может обойти эту проблему за счет сочетания API Reqs и количество вирусов известно только во время выполнения
  • Может быть любое количество из них, но reali (Vectors)
  • Заказ неважен, поэтому сортировка и последовательность трюков и оптимизаций - это честная игра (не то, что на данном этапе я нашел в ней какую-то потребность, но с учетом бонусный вопрос ниже, они могут возникнуть)
  • Векторы на тот момент являются одноразовыми, поэтому перемещение трюков также является справедливой игрой.
  • Размер обычно небольшой, но в редких, но не незаконных случаях края может быть до нескольких миллионов ints ins некоторые или даже все из них
  • Память не большая проблема, в любой момент времени будет доступно несколько ГБ непрерывной памяти, и это не критическая система
  • Производительность не является критичной, это предполетная проверка, но поскольку она все еще обращена к пользователю, она не может выглядеть так, как приложение висит. Небольшая горстка секунд для сценариев кросс-сцены.

Поскольку я в настоящее время связан между двумя API-интерфейсами со строгими бинарными требованиями, это GCC 4.1.x ограничен, поэтому абсолютное и безумное отсутствие каких-либо C++ 0x, Boost 1.44 доступно.

В настоящее время все эти объекты содержат уникальные индексы, но в будущем создается отдельная фильтрованная матрица с удаленными дубликатами (в будущем использование может включать в себя каналы с перекрывающимися индексами) также может стать требованием, поэтому бонусные баллы, если это будет обработано.

C++ 11 решений или что-то еще все еще приветствуется. Я не ищу, чтобы кто-то выполнял мою домашнюю работу, у меня есть неуклюжая, но работающая часть, в любом случае, я больше после просветления и вдохновения поваренной книги, чем что-либо.

Заранее спасибо

+3

Я думаю, вы должны опубликовать свой код в любом случае, поэтому никто не публикует такой же код или хуже. Он также недвусмысленно выражает вашу цель. –

+0

Я бы с удовольствием, но в случае с «очевидным решением» он все еще производился на работе (и я сейчас дома), поэтому я бы наступал на ужасную землю, если бы разместил ее. Извиняюсь за это, я знаю, что это хорошая форма, но я не могу. –

+0

Итак, что вы напишете, если вам когда-нибудь понадобится сделать это снова? –

ответ

1

Это не 100% ясно, что вы хотите, но делает большую часть того, что вы сказали, я бы что-то вроде этого:

std::vector<std::vector<int>> v; // input, assume it's already filled 
std::size_t size = 0; 
for (std::vector<std::vector<int>>::const_iterator i = v.begin(); i != v.end(); ++i) 
{ 
    size += i->size(); 
} 

boost::scoped_array<int> array; 
if (size != 0) 
{ 
    array.reset(new int[size]); 
    std::size_t offset = 0; 
    for (std::vector<std::vector<int>>::const_iterator i = v.begin(); i != v.end(); ++i) 
    { 
     std::copy_n(&(*i)[0], i->size(), array + offset); 
     offset += i->size(); 
    } 
} 

// ...use array... 

Если вы хотите сделать array уникальных, вы можете сделать:

std::sort(array.get(), array.get() + size); 
std::size_t newSize = std::unique(array.get(), array.get() + size) - array.get(); 
// Now array is unique, assuming you only use elements [0, newSize) 

есть, вероятно, более эффективные способы сортировки и сделать уникальным (возможно сортировать каждый суб-вектор, а затем сделать совмещенную-сортировку стиля РАБОТЫ n при копировании их в новый массив (и просто не копировать существующие элементы)), но я стремлюсь к простому + правильному в своем ответе. Оптимизация может появиться позже, как только вы найдете правильное решение.

+0

Спасибо. Это ответ на проблему (которая, как я полагаю, представляет собой последовательность двумерных vect ints для одномерного массива). Могу ли я спросить, почему scoped_array? Просто потому, что он доступен и для удобства управления, или есть какая-то особенность там, которую я пропускаю? –

+0

@ThE_JacO: Просто потому, что он доступен и упрощает управление памятью (его деструктор освободит выделенную память, чтобы вам не пришлось). Если нужно, вы можете использовать необработанный указатель. – Cornstalks

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