Xin chào Tôi muốn (nhân, thêm, vv) vectơ theo giá trị vô hướng ví dụ myv1 * 3
, tôi biết tôi có thể thực hiện một chức năng với một vòng lặp, nhưng có cách nào để làm điều này sử dụng chức năng STL? Một cái gì đó giống như {Algorithm.h :: transform function}?Nhân các phần tử vectơ theo giá trị vô hướng sử dụng STL
Trả lời
Vâng, sử dụng std::transform
:
std::transform(myv1.begin(), myv1.end(), myv1.begin(),
std::bind1st(std::multiplies<T>(),3));
Nếu bạn có thể sử dụng valarray
thay vì vector
, nó có các toán tử dựng sẵn để thực hiện phép nhân vô hướng.
v *= 3;
Nếu bạn phải sử dụng một vector
, bạn thực sự có thể sử dụng transform
để thực hiện công việc:
transform(v.begin(), v.end(), v.begin(), _1 * 3);
(giả sử bạn có một cái gì đó tương tự như Boost.Lambda cho phép bạn dễ dàng tạo các đối tượng chức năng ẩn danh như _1 * 3
:-P)
Valaray là giải pháp đúng IMO. Với sự may mắn, việc triển khai của bạn sử dụng các hướng dẫn SSE để thực hiện quy trình, làm cho nó nhanh hơn đáng kể. Xem http://www.pixelglow.com/macstl/valarray/ để thực hiện việc khắc phục như vậy. Thật không may, nó không phải là rất phổ biến, vì vậy nếu bạn muốn những lợi thế của SSE hướng dẫn bạn có thể sẽ phải sử dụng trình biên dịch nội tại ... – Dragontamer5788
@ Dragon: 'valarray' là giải pháp STL tốt nhất, nhưng nó không phải là rất tốt cho hiệu suất cao tính toán vì nó có xu hướng sao chép dữ liệu trong bộ nhớ rất nhiều và tạo ra các chuỗi các vòng nhỏ chứa các hoạt động đơn lẻ có các mẫu truy cập bộ nhớ kém. Tuy nhiên, việc nâng cấp từ 'valarray' lên hệ thống khuôn mẫu biểu thức thích hợp là dễ dàng hơn. – Potatoswatter
Chỉ cần: nếu bạn có thể có dữ liệu của bạn trong một mảng kích thước cố định (giá trị float [N]), bạn có thể sử dụng nội tại SSE để làm cho nó nhanh hơn vì nó sẽ nhân cực bảy lần một lần (4).
Tôi biết điều này không phải STL như bạn muốn, nhưng nó là một cái gì đó bạn có thể thích ứng với nhu cầu khác nhau phát sinh.
Dưới đây là mẫu bạn có thể sử dụng để tính; 'func' sẽ là hàm bạn muốn làm: nhân, thêm, v.v. 'parm' là tham số thứ hai cho 'func'. Bạn có thể dễ dàng mở rộng này để có func khác nhau với nhiều parms của các loại khác nhau.
template<typename _ITStart, typename _ITEnd, typename _Func , typename _Value >
_ITStart xform(_ITStart its, _ITEnd ite, _Func func, _Value parm)
{
while (its != ite) { *its = func(*its, parm); its++; }
return its;
}
...
int mul(int a, int b) { return a*b; }
vector<int> v;
xform(v.begin(), v.end(), mul, 3); /* will multiply each element of v by 3 */
Ngoài ra, đây không phải là chức năng 'an toàn', bạn phải thực hiện kiểm tra loại/giá trị, v.v. trước khi sử dụng.
Công trình này, nhưng chủ yếu là phát minh lại bánh xe, như 'std :: transform' đã làm điều này cho bạn. –
Có - đã nhìn thấy trong câu trả lời được chấp nhận ... nhưng bạn có nhận ra niềm vui là tái tạo lại một bánh xe thực sự hoạt động;) Dù sao tôi sẽ tự bắn mình vào ngày tôi trở thành người tuân thủ;) – slashmais
Tôi nghĩ for_each
là rất apt khi bạn muốn đi qua một vector và thao tác từng phần tử theo một số mô hình, trong trường hợp này một lambda đơn giản sẽ đủ:
std::for_each(myv1.begin(), mtv1.end(), [](int &el){el *= 3; });
lưu ý rằng bất kỳ biến bạn muốn chụp để sử dụng hàm lambda (nói rằng bạn ví dụ như muốn nhân với một số vô hướng được xác định trước), đi vào khung như một tham chiếu.
Đây không phải là mục đích của ' std :: for_each'. 'std :: for_each' áp dụng một đối tượng hàm (có thể trạng thái) cho một phạm vi và sau đó trả về đối tượng hàm này. Nếu bạn muốn chuyển đổi một phạm vi sử dụng 'std :: transform' để làm cho ý định của bạn rõ ràng hơn. – sv90
- 1. SSE (SIMD): nhân vectơ theo vô hướng
- 2. Cách thêm phần tử theo yếu tố của hai vectơ STL?
- 3. Xóa phần tử bản đồ theo giá trị
- 4. jQuery chọn các phần tử tùy chọn theo giá trị
- 5. C++ nhận chỉ mục của phần tử mảng theo giá trị
- 6. XPath để chọn Phần tử theo giá trị thuộc tính
- 7. Nhân các hàng ma trận theo vectơ?
- 8. Trong R: Nối các phần tử vectơ theo hàng, chuyển đổi các hàng vectơ thành chuỗi
- 9. Giá trị SQLAlchemy và vô hướng
- 10. Xóa các phần tử trong stl :: vector bằng cách sử dụng các chỉ mục
- 11. Gán giá trị cho các lĩnh vực tương tự của mọi phần tử của phi vô hướng struct
- 12. Peek phần tử tiếp theo trong hộp chứa STL
- 13. xóa MỘT phần tử mảng theo giá trị trong ruby
- 14. Cách nhanh nhất để nhân các cột ma trận với các phần tử vectơ trong R
- 15. Nhân trường theo giá trị trong Mongodb
- 16. Trả về tiêu chuẩn :: vectơ theo giá trị
- 17. Giá trị POST của các phần tử biểu mẫu bị vô hiệu
- 18. Tham chiếu đến giá trị của phần tử bản đồ STL?
- 19. STL: Lưu trữ các tham chiếu hoặc giá trị?
- 20. bản đồ vectơ trong STL?
- 21. Hoạt động với || và && các toán tử phải được chuyển đổi thành các giá trị vô hướng lô-gic
- 22. lấy tất cả các giá trị của phần tử Form bằng cách sử dụng jquery?
- 23. Không thể sử dụng một giá trị vô hướng như một mảng
- 24. Không thể sử dụng một giá trị vô hướng như một mảng
- 25. R: Sử dụng thông tin vị trí của các phần tử khi lặp qua một vectơ.
- 26. XPath - Chọn các phần tử có giá trị bằng
- 27. Opencv nhân vô hướng và ma trận
- 28. Kết hợp hai vectơ STL với một mẫu thay thế
- 29. Javascript Nhận giá trị phần tử
- 30. tìm các phần tử phổ biến trong một số vectơ với R và áp dụng hàm
Cảm ơn rất nhiều đó là thiên tài !! –