2017-02-13 16 views
-1

Я хочу осуществить insert в C++ как это:как C++ вставить, как python?

// python code 
insertIndexes = [1, 1, 2, 2, 3, 3, 5] 
arr = [] 

toInsertValue = 0; 
for i in insertIndexes: 
    arr.insert(i, toInsertValue) 
    toInsertValue += 1 
print arr // [0, 1, 3, 5, 4, 6, 2] 

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

// !!C++ wrong code!! 
// vec is not initialized correctly 
vector<int> vec; 
int insertIndexes[] = {1, 1, 2, 2, 3, 3, 5} 
int toInsertValue = 0; 
for (int i = 0; i < sizeof(insertIndexes)/sizeof(insertIndexes[0]); i++) { 
    vec.insert(vec.begin() + insertIndexes[i], toInsertValue); 
    toInsertValue += 1; 
} 
+3

'Int индексов = {1, 1, 2, 2 , 3, 3, 5} '? Нахх ... Этот код плохо сформирован. – WhiZTiM

+0

Если у вас есть массив, вы можете использовать ['std :: begin'] (http://en.cppreference.com/w/cpp/iterator/begin) и [' std :: end'] (http: // en.cppreference.com/w/cpp/iterator/end), чтобы получить итераторы к массиву, и использовать [диапазон для 'for' loop] (http://en.cppreference.com/w/cpp/language/ range-for) или почти любую [стандартную функцию алгоритма] (http://en.cppreference.com/w/cpp/algorithm), ожидающую диапазон, определенный парой итераторов. –

+0

Каков ваш выход и ожидаемый выход? –

ответ

2

В Python вставка в индекс за пределами размера списка очень прощает, реализация проверяет, что местоположение вставки больше или равно len(list), затем добавляется новый элемент. В C++ std::vector это не так. Вам нужно будет сделать это самостоятельно.

auto offset = 0; 
for(auto x : indexes){ 
    if(x < vec.size())  //Is the selected index in range? 
     vec.insert(vec.begin() + x, offset++); 
    else 
     vec.insert(vec.end(), offset++);    
} 

Полный пример:

std::vector<int> indexes = {1, 1, 2, 2, 3, 3, 5}; 
std::vector<int> vec; 

auto offset = 0; 
for(auto x : indexes){ 
    auto iter = (x < int(vec.size())) ? vec.begin() + x : vec.end(); 
    vec.insert(iter, offset++); 
} 

std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, " ")); 

выходов (Как видно в прямом эфире на Coliru):

0 1 3 5 4 6 2 
+0

так извините, я просто ошибаюсь в коде python, я хочу это: http: //coliru.stacked -crooked.com/a/6bd0cb40dbf9ddb2 – roger

+0

@roger, тогда. Там у тебя даже есть. , : -) ... Надеюсь, это ответ на ваш вопрос, и ваша проблема решена? – WhiZTiM

0

При определении вектора без определенного размера, будет пустым, и все его индексирование (с итераторами или без них) будет за пределами, ведущее к undefined behavio r.

В вашем цикле вы должны проверить, что indexes[i] не выйдет за пределы, и если после этого размер вектора соответствующим образом или использовать push_back для добавления значения offset к вектору.

+0

Я думаю, вы меня неправильно поняли, так извините – roger

+0

@roger Подумайте об этом: если вектор пуст (изначально он), что означает 'vec.begin()' return for iterator? Он возвращает 'vec.end()'! И первое, что вы пытаетесь сделать int he loop? Вы хотите вставить элементы в позицию 'vec.end() + 1', которая находится за пределами. –

+0

yes Я знаю, что не так с моим кодом – roger