векторный конструктор, создающий вектор с одним меньшим элементом - PullRequest
1 голос
/ 28 июля 2011

Я пытаюсь разбить вектор на «почти равные» части и создать для них субвекторы.

Я задал оригинальный вопрос здесь: Как разбить вектор на n "почти равных" частей , но я нашел действительно хорошее решение, которое я пытаюсь использовать, отсюда: Лучший способ извлечь субвектор из вектора?

Я написал эту функцию для создания целых чисел для начальных и конечных значений (функция округления - это округление до указанных цифр.)

void split( double number, double parts )
{
    double loop = number / parts;

    for( int i = 0; i < parts; i++ )
    {
        int start = round( i * loop, 0 );
        int end = round( ( i + 1 ) * loop - 1, 0 );
        cout << start << " " << end << endl;
    }
}

Эта функция до сих пор работает нормально, но моя проблема в том, что когда я пытаюсь запустить это:

vector<some> dest( &source[start], &source[end] );

Затем он создает один элемент LESS, затем требуется. Я имею в виду, например, если я позвоню с

vector<some> dest( &source[0], &source[99] ); 

тогда в нем будет 99 элементов вместо 100. Почему это происходит?

Как я могу это исправить? Если я использую [end + 1], то он заканчивается на последнем векторе с "индексом вне диапазона".

Ответы [ 2 ]

4 голосов
/ 28 июля 2011

Конструктор vector (и все конструкторы STL, которые принимают диапазоны указателей, в этом отношении) предназначены для использования в диапазоне итераторов в стиле STL.При использовании итераторов вы указываете диапазон, предоставляя указатель на первый и последний элементы, а не на первый и последний элементы.Если вы хотите создать vector в качестве копии поддиапазона (0, 99) из другого vector, вы можете написать

vector<some> dest(source.begin(), source.begin() + 100);

Обратите внимание, что здесь используются итераторы vector для указаниячасть первых 100 элементов, а не operator[], которая имеет неопределенное поведение, когда указанный индекс выходит за пределы.В вашем случае это неопределенное поведение проявляется как ошибка отладки во время выполнения.Итераторы не имеют этой проблемы, поскольку они специально предназначены для использования таким образом.

Если вы хотите использовать необработанные массивы C ++ в качестве входных данных для конструктора vector, вы можете сделать это следующим образом:

vector<some> dest(source, source + 100);

Надеюсь, это поможет!

0 голосов
/ 28 июля 2011

Хотя использование &v[n] недопустимо, если v является std::vector с n элементами, которые вы можете использовать вместо

vector<some> dest(v.begin()+first, v.begin()+last+1);

даже если last+1 == n.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...