2014-01-13 3 views
0

Предположим, у нас есть массив с 10 элементами, и мы хотим извлечь из него 6-элементный подматрицу, содержащий первые три элемента и три последних элемента. Я не хочу, чтобы выделенный субмассив был независимым массивом, но я хочу, чтобы его элементы указывали на то же место в памяти, что и соответствующие элементы в исходном массиве. Как я могу это сделать?Как вы можете задать адрес элементов в массиве для указания на определенные элементы в другом массиве?

+1

Для начала, используйте [ 'станд :: VECTOR'] (http://en.cppreference.com/w/cpp/container/vector) вместо массивов. Тогда легко получить три последних предмета независимо от их размера. –

+0

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

ответ

2

Вы можете использовать массив указателей, чтобы указать на элементы в другой:

int a[10] = { 5, 3, 7, 4, 9, 2, 0, 3, 3, 6 }; 
int* b[6]; 
b[0] = &a[0]; 
b[1] = &a[1]; 

и так далее. Вы должны быть уверены, что a живет не менее, чем b.

Более идиоматическим решением может быть использование типа диапазона для удержания указателя на первый и один последний элемент, представляющий интерес. Диапазон будет повторяться так же, как и стандартный контейнер библиотеки. См. Например, boost.range, или вы можете развернуть минимальную и простую версию, используя указатели в качестве итераторов. Это удовлетворит ваш случай использования. Например:

struct range 
{ 
    typedef const int* const_iterator; 
    const_iterator begin() const {return begin_;} 
    const_iterator end() const { return end_; } 
    range(const int* begin, const int* end) : begin_(begin), end_(end) {} 
    std::size_t size() const {return end_ - begin_ }; 
private: 
    int* begin_; 
    int* end_; 
}; 

Затем

int a[10] = { 5, 3, 7, 4, 9, 2, 0, 3, 3, 6 }; 
range b(&a[0], &a[3); 
for (range::const_iterator i = b.begin(); i != b.end(); ++i) 
    std::cout << *i << " "; 
std::cout << std::endl; 
+0

Что делать, если у меня есть что-то вроде 'int * b;' в моем классе, и я хочу, чтобы он указывал на элементы массива 'a'? –

+0

'int * b' не является массивом, это указатель на int. Таким образом, вы должны сначала указать его на массив, а затем сделать то же, что и в этом примере. Но это еще одна история и другой вопрос. – juanchopanza

+0

@MohammadSanei Что я сказал в своем предыдущем комментарии, за исключением того, что массив должен быть динамически распределен. В этом случае я бы предложил вам вместо этого использовать вектор указателей. – juanchopanza

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