[英]How to copy data from `boost::scoped_array` to `std::vector`
vector<int> vec;
boost::scoped_array<int> scpaInts;
scpaInts.reset(new int[10]);
for (int i=0; i<10; i++)
scpaInts[i] = i*2;
vec.assign(&scpaInts[0], &scpaInts[9]+1); // => method one
vec.assign(scpaInts.get(), scpaInts.get()+10); // => method two
問題1>我找到了兩種方法。 但我不確定它們是否正確或有更好的方法來做到這一點。
問題2>我們無法從boost :: scoped_array獲取有效長度嗎?
謝謝
問題1:兩種方法都可以。 指向數組元素的指針可以扮演隨機訪問迭代器的角色。 這個也很好
vec.assign(&scpaInts[0], &scpaInts[10]);
問題2:這是正確的,因為您無法獲得傳遞給函數的C樣式數組的長度。
兩者都可以。 但第二個對我來說更清楚。 boost::scoped_array
作為簡單數組工作,你現在無法獲得數據大小。 要將其復制到矢量,您必須知道它的大小。 這是關於scoped_array迭代器和大小的鏈接。
我選擇方法2:
vec.assign(scpaInts.get(), scpaInts.get()+10); // => method two
像普通的動態數組一樣:
int * a = new int[10];
...
vec.assign(a, a+10); // => method two
當然,方法1也適用,例如動態數組:
vec.assign(&a[0], &a[9]+1); // => method one
正如您所看到的 - 方法2看起來更簡單,因此更好。
並且,不,在作用域數組中沒有size()
方法。
問題1:兩種方法都是正確的。
問題2:正確,它只是一個類似於std :: scoped_ptr的容器,它確保傳遞的指針(使用operator new[]
手動創建)將使用operator delete []
。 它不包含有關數組大小的任何信息。
這兩種方法對我來說都是正確的,但第二種方法肯定更清晰,因為你沒有將偏移分成9
和1
組件。 還有另外兩個選擇:
vec.assign(&scpaInts[0], &scpaInts[0] + 10);
或者在您需要之前不要創建向量(最好的選項):
vector<int> vec(scpaInts.get(), scpaInts.get() + 10);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.