[英]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.