Trong C++, có cách nào để gọi hàm trên mỗi phần tử của vec-tơ, mà không sử dụng vòng lặp chạy trên tất cả các phần tử vectơ không? Một cái gì đó tương tự như một 'bản đồ' trong Python.Gọi hàm trên mọi phần tử của vector C++
Trả lời
Có: std::for_each
.
void foo(int a) {
std::cout << a << "\n";
}
std::vector<int> v;
...
std::for_each(v.begin(), v.end(), &foo);
Bạn có thể sử dụng một cặp lặp và chức năng hoặc hàm.
Sử dụng for_each
:
// for_each example
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
void myfunction (int i) {
cout << " " << i;
}
struct myclass {
void operator() (int i) {cout << " " << i;}
} myobject;
int main() {
vector<int> myvector;
myvector.push_back(10);
myvector.push_back(20);
myvector.push_back(30);
cout << "myvector contains:";
for_each (myvector.begin(), myvector.end(), myfunction);
// or:
cout << "\nmyvector contains:";
for_each (myvector.begin(), myvector.end(), myobject);
cout << endl;
return 0;
}
Nếu bạn có C++ 11, có một phương pháp thậm chí ngắn hơn: ranged-based for. Mục đích của nó là chính xác điều này.
std::vector<int> v {1,2,3,4,5};
for (int element : v)
std::cout << element; //prints 12345
Bạn cũng có thể áp dụng tham chiếu và const cho nó, khi thích hợp hoặc sử dụng tự động khi loại đó dài.
std::vector<std::vector<int>> v {{1,2,3},{4,5,6}};
for (const auto &vec : v)
{
for (int element : vec)
cout << element;
cout << '\n';
}
Output:
123
456
Cú pháp này chưa được hỗ trợ bởi vs2011 chẳng hạn. Ít nhất không phải bản sao của tôi.Nhưng +1. – ervinbosenbacher
@xebo, ah, điều đó không thể thấy được vì đây là một trong những tính năng tốt nhất của C++ 11 imo. – chris
Đối với bất kỳ khách truy cập nào trong tương lai, phạm vi đã được thêm vào Visual Studio 2012. – chris
On C++ 11: Bạn có thể sử dụng một lambda. Ví dụ:
std::vector<int> nums{3, 4, 2, 9, 15, 267};
std::for_each(nums.begin(), nums.end(), [](int &n){ n++; });
Thực sự là một giải pháp tốt nếu phạm vi không có sẵn. – chris
Bạn đã nhận được vài câu trả lời nhắc std::for_each
.
Trong khi những câu trả lời này cho câu hỏi bạn đã hỏi, tôi sẽ thêm ít nhất theo kinh nghiệm của tôi, std::for_each
là về ít nhất hữu ích của các thuật toán chuẩn.
Tôi sử dụng (cho một ví dụ) std::transform
, về cơ bản là a[i] = f(b[i]);
hoặc result[i] = f(a[i], b[i]);
nhiều hơn thường xuyên hơn std::for_each
. Nhiều người thường xuyên sử dụng std::for_each
để in các phần tử của bộ sưu tập; vì mục đích đó, std::copy
với số std::ostream_iterator
làm điểm đến hoạt động tốt hơn nhiều.
Đây là câu trả lời tôi đang tìm kiếm, 'transform' gần với' map' của Python hơn 'for_each', vì' map' tạo ra một danh sách các đầu ra, trong khi 'for_each' gọi hàm nhưng loại bỏ kết quả đầu ra. –
- 1. Gọi hàm thành viên của mọi phần tử của vector C++
- 2. MATLAB: trích xuất mọi phần tử thứ n của vector
- 3. KnockoutJS gọi hàm afterAdd trên các phần tử khoảng trắng
- 4. Gọi hàm int() trên mỗi phần tử danh sách?
- 5. C++ cho mỗi phần, kéo từ các phần tử vector
- 6. Nhận ID của phần tử được gọi là hàm
- 7. C++ 11 khởi tạo vector trong một cuộc gọi hàm
- 8. cách ngắn hơn để vượt qua mọi phần tử của một mảng tới một hàm
- 9. Cách nhận phần tử phụ thứ hai của mọi phần tử trong danh sách
- 10. Cách in các phần tử trong vector C++
- 11. Bỏ qua mọi phần tử khác sau
- 12. Bắt mọi phần tử thứ n của một chuỗi
- 13. Gọi hàm ngẫu nhiên trên phần trăm?
- 14. cách xóa mọi kiểu khỏi phần tử?
- 15. Thêm các phần tử vào một vector trong vòng lặp dựa trên dải C++ 11
- 16. 4 Phần tử Vector (3D Math)
- 17. Xóa các phần tử khỏi một vector
- 18. Tính trung bình trên mọi phần tử n của một mảng có nhiều mảng
- 19. clojure - xóa một phần tử khỏi một vector ref
- 20. Tìm vị trí của phần tử trong C++ 11 dựa trên phạm vi cho vòng lặp?
- 21. đếm các phần tử mới trong danh sách vector
- 22. Làm thế nào để áp dụng hàm trên mỗi chỉ số của phần tử ma trận
- 23. C# gọi một hàm khởi tạo từ phần thân khác
- 24. Chọn mọi phần tử thứ hai từ mảng bằng lambda
- 25. R cách liệt kê mọi phần tử khác?
- 26. C - phần tử nằm ngoài phần đầu của một mảng
- 27. Bạn sẽ loại bỏ các phần tử của std :: vector dựa trên một số thuộc tính của các phần tử như thế nào?
- 28. Chuyển ID phần tử sang hàm Javascript
- 29. Mã cho phần tử thứ hai thành phần tử cuối cùng trong một vector
- 30. Toán tử vs Hàm trong C/C++
có thể mong đợi cải thiện tốc độ khi sử dụng điều này (trái ngược với vòng lặp) không? – dbliss
@dbliss, việc thực hiện 'for_each()' có thể là một vòng lặp giống nhau và vì nó sử dụng các mẫu, nên không có sự khác biệt. Tuy nhiên, với C++ 17, họ có thể giới thiệu song song mà sẽ hoàn toàn minh bạch cho bạn và nó có thể rất tốt sẽ bắt đầu nhanh hơn. –