2013-10-17 25 views
0

我插入元素與push_back在向量中。我想讀取FIFO中的數據並使用迭代器分配給矢量的開頭。在矢量中有沒有其他方法讀取FIFO中的數據?C++向量插入和讀取

+0

你想建立一個隊列嗎?即閱讀後你是否刪除了這些元素? – Henrik

+0

是的我正在通過使用迭代器擦除功能刪除。 –

+0

然後使用deque代替@Didac建議的向量。 – Henrik

回答

5

您可以使用std::deque()及其pop_front()方法。

+0

我沒有看到pop_front()。它是爲矢量定義的嗎? –

+2

不在向量中,使用'std :: deque'而不是'std :: vector',它有前後兩個引用,它們可能會給你你想要的。 –

+0

我在閱讀之前還要檢查它是否爲空。 –

0

的代碼將是:

auto value = myvector[0]; 
myvector.erase(myvector.begin()); 

然而,從一開始(或介於兩者之間)去除元件是緩慢的,因爲它必須整個陣列複製。訪問是快速的,但是:vector允許O(1)中的隨機訪問(即通過任何顯式索引訪問)(即恆定訪問時間,即非常快)。

但是另一個容器結構而不是vector可能對你更有意義,例如, listdeque。一些STL實現(或其他框架)也有類似rope的東西,這在很多情況下都是兩全其美的。

+0

這是LIFO,不是FIFO。 – Oswald

+0

實際上,除非元素拷貝的代價非常昂貴,或者有數以百萬計的元素,'std :: vector'可能會比'std :: deque'好(並且幾乎可以肯定會勝過'std :: list') 。然而'pop_front()'的便利性表明了'std :: deque'。 –

+0

@JamesKanze:通過方便,你的意思是它只是輸入而不是兩個命令(訪問+「擦除」)更短?如果'vector'會更快,那麼是否證明'deque'的用法呢? – Albert

0

您可以訪問vecotr的元素,就像你訪問數組中的元素:

std::vector<std::string> vec; 
// Excluded: push items onto vec 
for (int i = 0; i < vec.size(); ++i) { 
    // Example: 
    std::cout << vec[i]; 
} 
0

沒有什麼特別要注意。要插入,使用 push_back,提取,你需要的東西,如:

if (!fifo.empty()) { 
    ValueType results = fifo.front(); 
    fifo.erase(fifo.begin()); 
} 

(不要忘記嘗試刪除 元素之前檢查空)

重要的一點要記住的是那兩個push_back和 在某些情況下erase可以使迭代器無效,所以你不要 要保持迭代器進入底層向量掛在 左右。