Это не очень хорошая идея, но я покажу вам, как.
Вы можете получить необработанный указатель на целое число следующим образом:
int * myPointer2 = (int*)&(s[0]);
но это действительно плохая практика, потому что вы не можете гарантировать, что структура span не имеет никакого отступа , поэтому, хотя она может хорошо работать для меня и для вас сегодня, мы не можем сказать много за другие системы.
#include <iostream>
#include <vector>
struct Span{
int from;
int to;
};
int main()
{
std::vector<Span> s;
Span a = { 1, 2};
Span b = {2, 9};
Span c = {10, 14};
s.push_back(a);
s.push_back(b);
s.push_back(c);
int * myPointer = (int*)&(s[0]);
for(int k = 0; k < 6; k++)
{
std::cout << myPointer[k] << std::endl;
}
return 0;
}
Как я уже сказал, это сложное повторное толкование часто работает, но очень опасно и не имеет кроссплатформенных гарантий, которые вы обычно ожидаете от C / C ++.
Следующая худшая вещь - это то, что на самом деле будет делать то, что вы просили, но вы никогда не должны делать. Вот код, за который вы можете получить:
// Baaaad mojo here: turn a vector<span> into a vector<int>:
std::vector<int> * pis = (std::vector<int>*)&s;
for ( std::vector<int>::iterator It = pis->begin(); It != pis->end(); It++ )
std::cout << *It << std::endl;
Обратите внимание, как я использую указатель на вектор и указываю на адрес векторного объекта s. Я надеюсь, что внутренности обоих векторов одинаковы, и я могу использовать их просто так. Для меня это работает, и хотя стандартные шаблоны, к счастью, могут требовать, чтобы это имело место, это не так, как правило, для шаблонных классов (см. Такие вещи, как заполнение и специализация шаблонов).
Попробуйте вместо этого скопировать массив (см. Ссылку 2 ниже) или просто использовать s 1 .from и s [2] .to.
Связанное чтение:
- Являются ли элементы std :: vector гарантированно смежными?
- Как преобразовать вектор в массив в C ++