2013-10-02 68 views
1

假設下面的基本向量的值:移在C++中的矢量

std::vector<int> numbers; 
numbers.push_back(0); 
numbers.push_back(1); 
numbers.push_back(2); 
numbers.push_back(3); 

什麼是在0和1之間插入6個新的號碼的有效方式?

這裏是我的方法現在,但我覺得這是不是很有效:

for (int new_number=0;new_number<6;new_number++) { 
    numbers.emplace(numbers.begin()+1+new_number,new_number); 
} 

我不喜歡這種方式的原因是,數字1-3必須移動6次 。有沒有辦法將這些數字移動一次而不是6次?然後,我可以用這個循環:

for (int new_number=0;new_number<6;new_number++) { 
    numbers[new_number+1]=new_number; 
} 

這裏就是我試圖完成:

向量移位之前:

0 1 2 3 

向量移位後:

0 X X X X X X 1 2 3 
+1

我認爲,我們確實需要知道更多有關該問題的幫助,插入到矢量的中間永遠不會好,儘量避免它 – aaronman

+0

@aaronman我需要一個向量,因爲數據必須對齊我正在使用的API – Grapes

+1

如果您無法像dasblightenlink的答案中那樣插入連續的範圍,則可以使用後端插入後跟「std :: rotate」。 –

回答

6

還有就是insert功能,可以讓你插入n相同項目的過載:

// Add six copies of -1 to the vector starting at position 1 
numbers.insert(numbers.begin()+1, 6, -1); 

您可以使用另一個重載需要三個迭代器 - 迭代器在哪裏插入,和開始/結束對迭代器從哪裏取數據:

// Insert addedNUmbers at position 1 
numbers.insert(numbers.begin()+1, addedNUmbers.begin(), addedNUmbers.end()); 
+0

* * newer * overload已經出現在C++ 03 –

+0

@DavidRodríguez-dribeas糟糕,謝謝指出!我不知道爲什麼我認爲它直到C++ 11才被添加,即使我發佈的鏈接是「在C++ 11之前」。謝謝! – dasblinkenlight

+0

你可以插入一個支撐列表嗎?! –

0

東西像這樣會在numbers的開頭插入6

numbers.insert(numbers.begin(), 6); 

如果你想頭號之後插入數6:

numbers.insert(find(numbers.begin(), numbers.end(), 1), 6); 

(當然,如果你不知道肯定的數量是在列表中,您可能希望檢查是否插入前)

2

如果必須插入項目一個接一個來自不同來源的,所以你不能使用的範圍內插入,一種選擇是在後面插入的一切,然後用std::rotate

#include <algorithm> 

v.reserve(v.size() + 6); 

v.push_back(12); 
v.push_back(foo()); 
// ... 

std::rotate(v.begin() + 1, v.begin() + 4, v.end()); 
+0

以及? – Grapes

+1

@Grapes:對於整數?爲什麼? –

+0

如果它們不是整數? – Grapes