簡體   English   中英

我不想使用std :: copy ...這是正確的for循環替代方案嗎?

[英]i don't want to use std::copy…his this the right for-loop alternative?

我試圖不使用STL。 我的代碼中有這一行:

std::copy(buffer_, buffer_ + size_ + 1, new_buffer)

如果我不想使用副本,這對嗎?

for (int i = 0; i < (size_ + 1); i++){
    new_buffer[i] = buffer[i];
}

還是完全錯誤? 還是一個人解決? 或者是其他東西?

謝謝!

好的,您擁有的兩個代碼樣本將得出相同的結果。

但是,如果您使用size_ + 1 ,那么將出現一個錯誤的錯誤。 size_是正確的值,因為它已經指向最后一個元素之后的一個。

尚不清楚您編寫的內容是否有效。 如果buffer_任何隨機訪問且new_buffer任何輸出迭代器,則copy版本有效。 僅當buffer_是指針時,您的手動版本才有效。

除此之外,您的手冊版本在功能上是等效的。 但是,如果類型是POD,則使用memcpy可能會做得更好(要檢查是否有重疊)。

請注意,緩沖區(編寫方式)的大小為size_ + 1

這就是我要這樣做的方式,因為它可以更容易地與常規迭代器(類似於std :: copy)一起重用,因為特定於迭代器類型(隨機訪問)的代碼不在循環內:

buffer_type* begin = buffer; // EDIT: buffer_type is whatever type buffer contains.
buffer_type* end = buffer + size + 1; // EDIT: usually this would be 'buffer + size'
buffer_type* out = new_buffer; // EDIT: don't want to lose the pointer to new_buffer!

while(buffer != end) {
  *out = *begin
  ++begin; ++new_buffer;
}

因此,如果您決定使用其他類型的迭代器,則無需更改循環。

一些代碼檢查實用程序可能會抱怨這一點,因為它們認為您將發生訪問沖突,但事實並非如此,因為上次取消引用發生在最后一次遞增之前。

變量名稱的size選擇在這里有點令人困惑,BTW。 這意味着buffer + size將是buffer末尾的1,因為您開始將數組元素的標簽標記為零,但是您開始將它們標記為1,因此最后一個元素的索引size - 1

另外,如果要使用for循環和索引運算符,則應使用unsigned int進行索引。 負索引是合法的,但我不認為您打算在這里允許它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM