2012-03-14 16 views
16

Giả sử tôi có vectơ có giá trị [1,2,3,4,5,6,7,8,9,10]. Tôi muốn tạo một vectơ mới đề cập đến, ví dụ, [5,6,7,8]. Tôi tưởng tượng đây chỉ là vấn đề tạo ra một vector với con trỏ hoặc tôi có phải push_back tất cả các giá trị trung gian mà tôi cần không?Tạo một trình con C++ mới?

+0

Những câu trả lời cho đến nay là lựa chọn tất cả đều tốt. Trong khi bạn * có thể * tạo ra một vectơ con trỏ tới vùng phụ của bạn, có thể bạn không muốn. Nếu vector ban đầu từng phát triển đến điểm mà nó phải phân bổ lại bộ nhớ trong của nó, thì con trỏ của bạn sẽ trở thành không hợp lệ. Đặc biệt là khi đối phó với các phạm vi nhỏ như vậy, làm việc với một bản sao là thích hợp hơn. –

+0

Xác định "đề cập đến". Điều gì sẽ xảy ra nếu vector ban đầu thay đổi? –

+2

Bản sao có thể có của [Cách tốt nhất để trích xuất một thư mục con từ một vectơ?] (Http://stackoverflow.com/questions/421573/best-way-to-extract-a-subvector-from-a-vector) – TobiMcNamobi

Trả lời

36

Một trong những constructor std::vector 's chấp nhận một khoảng:

std::vector<int> v; 

// Populate v. 
for (int i = 1; i <= 10; i++) v.push_back(i); 

// Construct v1 from subrange in v. 
std::vector<int> v1(v.begin() + 4, v.end() - 2); 
4

Bạn không cần phải sử dụng push_back nếu bạn không muốn, bạn có thể sử dụng std::copy:

std::vector<int> subvector; 
copy (v1.begin() + 4, v1.begin() + 8, std::back_inserter(subvector)); 
+2

Shouldn ' t bạn khởi tạo subvector với kích thước chính xác trước khi sao chép vào nó? – obmarg

+2

@obmarg hoặc bạn có thể sử dụng một số dạng 'insert_iterator'. –

+0

@obmarg có hoặc sử dụng trình lặp lặp lại - 'std :: back_inserter' sẽ tạo một cho bạn – Flexo

3

tôi sẽ làm như sau:

#include <vector> 
#include <iostream> 

using namespace std; 

void printvec(vector<int>& v){ 
     for(int i = 0;i < v.size();i++){ 
       cout << v[i] << " "; 
     } 
     cout << endl; 
} 

int main(){ 
     vector<int> v; 

     for(int i = 1;i <= 10;i++) v.push_back(i); 
     printvec(v); 

     vector<int> v2(v.begin()+4, v.end()-2); 
     printvec(v2); 
     return 0; 
} 

~

4

này là khá dễ dàng để làm với std::valarray thay vì một vector:

#include <valarray> 
#include <iostream> 
#include <iterator> 
#include <algorithm> 

int main() { 
    const std::valarray<int> arr={0,1,2,3,4,5,6,7,8,9,10}; 

    const std::valarray<int>& slice = arr[std::slice(5, // start pos 
                4, // size 
                1 // stride 
               )]; 

} 

nào có một "miếng" của valarray, quát hơn một vector.

Đối với một vector bạn có thể làm điều đó với các nhà xây dựng mà phải mất hai lặp mặc dù:

const std::vector<int> arr={0,1,2,3,4,5,6,7,8,9,10}; 
std::vector<int> slice(arr.begin()+5, arr.begin()+9); 
Các vấn đề liên quan