Если вы хотите объединить массивы , не копируя элементы , и в то же время вы хотите получить доступ к элементам, используя оператор индекса, т.е. []
, то это невозможно без написания класса, который инкапсулируетвсе такие функциональные возможности.
Я написал следующий класс с минимальным вниманием, но он демонстрирует основную идею, которую вы можете отредактировать, если хотите, чтобы у нее были функциональные возможности, которых в данный момент нет.Также должно быть несколько ошибок, которые я не написал, просто чтобы он выглядел короче, но я верю, что вы поймете код и соответственно обработаете ошибки.
template<typename T>
class joinable_array
{
std::vector<T*> m_data;
std::vector<size_t> m_size;
size_t m_allsize;
public:
joinable_array() : m_allsize() { }
joinable_array(T *a, size_t len) : m_allsize() { join(a,len);}
void join(T *a, size_t len)
{
m_data.push_back(a);
m_size.push_back(len);
m_allsize += len;
}
T & operator[](size_t i)
{
index ix = get_index(i);
return m_data[ix.v][ix.i];
}
const T & operator[](size_t i) const
{
index ix = get_index(i);
return m_data[ix.v][ix.i];
}
size_t size() const { return m_allsize; }
private:
struct index
{
size_t v;
size_t i;
};
index get_index(size_t i) const
{
index ix = { 0, i};
for(auto it = m_size.begin(); it != m_size.end(); it++)
{
if ( ix.i >= *it ) { ix.i -= *it; ix.v++; }
else break;
}
return ix;
}
};
И вот один тесткод:
#define alen(a) sizeof(a)/sizeof(*a)
int main() {
int a[] = {1,2,3,4,5,6};
int b[] = {11,12,13,14,15,16,17,18};
joinable_array<int> arr(a,alen(a));
arr.join(b, alen(b));
arr.join(a, alen(a)); //join it again!
for(size_t i = 0 ; i < arr.size() ; i++ )
std::cout << arr[i] << " ";
}
Выход:
1 2 3 4 5 6 11 12 13 14 15 16 17 18 1 2 3 4 5 6
Демонстрационная версия онлайн: http://ideone.com/VRSJI