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?
16
A
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));
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
- 1. C# Tạo mới T()
- 2. Khởi tạo một con trỏ tĩnh trong C++
- 3. Tạo một tác vụ mới chạy chương trình
- 4. .net C#: Tạo một Quy trình Async
- 5. Tạo mới một cấu trúc rỗng làm gì trong C#?
- 6. Làm thế nào để tạo một lớp con trong C#?
- 7. Khởi tạo mảng con trỏ C++
- 8. Là một tiến trình con sinh ra được coi là một dyno mới trên Heroku?
- 9. C++: Khởi tạo con trỏ đến con trỏ đến int
- 10. Trình tạo mã C#
- 11. Cần tạo một RunTimeException mới cho EmptyStacks
- 12. toán tử "mới" trong C++, câu hỏi con trỏ
- 13. Tạo một TableVIew Lập trình với Objective-C iOS
- 14. Trình chỉnh sửa ACE: tạo trình chỉnh sửa mới động
- 15. Khởi tạo một con trỏ
- 16. Phần trên của việc tạo SqlConnection mới trong C#
- 17. Cách tạo bố cục tuyến tính thêm chế độ xem con trong một dòng mới?
- 18. Tạo trình kích hoạt để chỉ chạy khi một bảng mới đang được tạo
- 19. C++ không thể khởi tạo một con trỏ trong một cặp thành NULL
- 20. Quy trình con Nodejs: ghi vào stdin từ một quá trình đã được khởi tạo
- 21. C++ win32 GUI lập trình, con đường ngắn nhất?
- 22. Tạo menu con trong trình khám phá-mở rộng vỏ?
- 23. Plugin Eclipse: tạo một tệp mới
- 24. Làm cách nào để mã đơn vị thử nghiệm tạo một Quy trình mới?
- 25. Cách tạo trình tạo/trình vòng lặp với API C C?
- 26. C++: con trỏ thành viên được khởi tạo? mẫu
- 27. Tạo một con nhện phế liệu chung
- 28. C# Đọc stdout của quá trình con không đồng bộ
- 29. Ngôn ngữ lập trình để tạo DLL: C++ hoặc C#
- 30. Cấu trúc khởi tạo con trỏ trong C#
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. –
Xác định "đề cập đến". Điều gì sẽ xảy ra nếu vector ban đầu thay đổi? –
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