- Siêu lớp và danh mục iOS/Objective-C
- object-c - -1001 lỗi khi NSURLSession vượt qua httpproxy và /etc/hosts
- java - Nhận địa chỉ url bằng lớp mạng
- ios - Âm thanh không phát trong thông báo đẩy
Từ đoạn mã dưới đây tôi nên kết luận,std::biến đổi
So sánh tăng :: biến đổi
Thích hợp hơn vì cái trước sử dụng ít bộ khởi tạo và hàm hủy hơn và có lẽ hiệu quả hơn cái sau?
#include
#include
lớp Ftor {
public:
Ftor(const Ftor& rhs): t(rhs.t)
{ std::cout << " Ftor : copy\n" }
Ftor(tỷ giá thả nổi) : t(tỷ giá)
{ std::cout << " Ftor : init\n" }
~Ftor()
{ std::cout << "~Ftor : ...\n" }
toán tử float() (float x) { return x < t ?
private:
phao t;
};
typedef std::vector vec_t;
int chính (void)
{
vec_t arg(/*...*/);
vec_t val(arg.size());
phao x = 1,0;
/*Kiểm tra biến đổi tiêu chuẩn */
std::cout << "Biến đổi tiêu chuẩn:\n";
std::transform(arg.begin(), arg.end(), val.begin(), Ftor(x));
std::cout << "Tăng cường biến đổi:\n";
/*Kiểm tra biến đổi tăng cường */
boost::transform(boost::make_iterator_range(arg.begin(), arg.end()),
val.begin(), Ftor(x));
}
Đầu ra:
Biến đổi tiêu chuẩn:
Dành cho: khởi tạo
~Ftor: ...
Tăng cường chuyển đổi:
Dành cho: khởi tạo
Dành cho: sao chép
~Ftor: ...
~Ftor: ...
Chuyển đổi tiêu chuẩn sử dụng 2 cuộc gọi. Việc chuyển đổi Boost sử dụng 4 cuộc gọi. Chuyển đổi tiêu chuẩn thắng. vẫn……?
phụ lục
Như @sehe đã đề xuất,std::ref
mọi cuộc gọibiến đổi
lưu một hàm tạo khităng :: biến đổi
Chỉ sử dụng một cuộc gọi. Nhưng std::ref
Các biến tạm thời không thể được truyền dưới dạng tham số. Tuy nhiên, vượt qua Ftor f(x)
Không sao đâu vì sau này có địa chỉ rõ ràng.
Các lệnh gọi hàm tạo/hàm hủy được tính khi biến đổi được gọi trong vòng lặp. Bây giờ tôi có hai tùy chọn tăng cường:
std::cout << "với std::ref\n";
vì (/*...*/) {
x = ...;
f = Ftor(x);
boost::transform(arg, val.begin(), std::ref(f));
}
std::cout << "với tạm thời\n";
vì (/*...*/) {
x = ...;
boost::transform(arg, val.begin(), Ftor(x));
}
Đầu ra:
với std::ref
Dành cho: khởi tạo
Dành cho: khởi tạo
...
~Ftor: ...
với tạm thời
Dành cho: khởi tạo
Dành cho: sao chép
~Ftor: ...
~Ftor: ...
Dành cho: khởi tạo
Dành cho: sao chép
~Ftor: ...
~Ftor: ...
...
Tôi có gcc (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4 để sử dụng hoặc không sử dụng -O3
sẽ tạo ra kết quả tương tự.
Việc các hàm tạo/hàm hủy có "đắt" hay không là liên quan đếntoán tử()
Về mặt. Đây là sản phẩm cuối cùng sẽ thực hiện các phép toán ít đòi hỏi khắt khe hơn, không giống như ví dụ trên.
câu trả lời hay nhất
Các thuật toán STL có thể sao chép các vị từ/hàm năng của chúng. Điều này chủ yếu là do chúng được truyền theo giá trị.
您看到的是 tăng
xong一次 Chuyển tiếp cuộc gọi.
Thường thì không. Trình biên dịch rất giỏi trong việc nội tuyến, sao chép và phân tích phụ thuộc.
Rất có thể, mã được tạo sẽ giống hệt nhau.
Tất nhiên, việc thêm
cout
các câu lệnh hoàn toàn phá hỏng điều đó. không có tác dụng phụ của hàm tạo/hàm hủy làm hỏng nó!
so sánh công bằng dùng không có tác dụng phụĐược tạo cho các biến thể STL và Boostnhư nhauMã số:http://paste.ubuntu.com/14544891/
Theo cách thiết kế STL (và các thuật toán tăng cường), bạn có thể chuyển các functor một cách rõ ràng bằng cách tham chiếu nếu cần. Bạn sử dụng cho việc này std::ref
:
#include
#include
#include
#include
#include
lớp Ftor {
public:
Ftor(const Ftor &rhs) : t(rhs.t) { std::cout << " Ftor : copy" << std::endl }
Ftor(tỷ lệ thả nổi) : t(tỷ lệ) { std::cout << " Ftor : init" << std::endl }
~Ftor() { std::cout << "~Ftor : ..." << std::endl }
toán tử float()(float x) { return x }
private:
phao t;
};
typedef std::vector vec_t;
int chính(void) {
vec_t arg(190, 1), val(arg.size());
{
std::cout << "Biến đổi STL: " << std::endl;
Ftor f(1.0);
std::transform(arg.begin(), arg.end(), val.begin(), std::ref(f));
}
std::cout << "-----\n";
{
std::cout << "Tăng cường biến đổi: " << std::endl;
Ftor f(1.0);
boost::transform(arg, val.begin(), std::ref(f));
}
std::cout << "-----\n";
}
In
Biến đổi STL:
Dành cho: khởi tạo
~Ftor: ...
-----
Tăng cường chuyển đổi:
Dành cho: khởi tạo
~Ftor: ...
-----
Để ý Dù sao, hãy sử dụng thuật toán phạm vi trên vùng chứa và xây dựng phạm viRất rất mỉa mai boost::make_iterator_range(arg.begin() , arg.end())
thay vì chỉ sử dụng tranh cãi
:
boost::transform(arg, val.begin(), Ftor(x));
Về c++ - boost::transform so với std::transform, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/34837866/
Tôi đang cố phân tích nội dung nào đó bằng thư viện qi của boost.spirit và tôi đang gặp sự cố. Theo các tài liệu tinh thần, a >> b sẽ tạo ra thứ gì đó thuộc loại tuple. Nhưng đây là boost::tuple (hay còn gọi là fusio
Dường như có/đang nỗ lực thực hiện việc này, nhưng hầu hết các tài nguyên tôi thấy cho đến nay đều đã lỗi thời (có liên kết chết) hoặc có ít thông tin để thực sự xây dựng một mẫu hoạt động nhỏ (ví dụ: dựa vào boost chương trình_options để xây dựng tệp thực thi
Tôi hơi bối rối về trạng thái của Boost.Log. Đây có phải là phần chính thức của Boost hay nó chưa được chấp nhận? Khi tôi tìm trên Google, tôi thấy một số bài đăng nói về cách nó được chấp nhận vào năm 2010, v.v. nhưng khi tôi xem thư viện Boost cuối cùng
Boost cung cấp hai cách triển khai string_view khác nhau, sẽ trở thành một phần của C++17: boost::string_ref trong tiện ích/string_ref.hpp boost::stri
Gần đây, tôi được một công ty GIS thuê để viết lại cơ sở thông tin địa lý cũ của họ. Vì vậy, tôi hiện đang tìm kiếm một thư viện hình học tính toán tốt. Tôi đã xem CGAL và nó thật tuyệt vời, nhưng sếp của tôi muốn nội dung miễn phí. Vì vậy, tôi đang kiểm tra Boost.Geometry.
Giả sử tôi có đồ thị vô hướng G. Giả sử tôi thêm add_edge(1,2,G); add_edge(1,3,G); add_edge(0,2,G); Bây giờ hãy để tôi nói lại: add_edge(0,2,G);
Tôi sử dụng CMake để tìm Boost. Đã tìm thấy Boost nhưng lỗi CMake Các mục tiêu đã nhập không có sẵn cho phiên bản Boost Xem lỗi đầy đủ bên dưới
Tôi mới sử dụng các thư viện boost::fusion và boost::mpl. Có ai có thể cho tôi biết sự khác biệt chính giữa hai thư viện này không? Cho đến nay tôi chỉ sử dụng fusion::vector và một số nội dung đơn giản khác. Bây giờ tôi muốn sử dụng fus
Câu hỏi này đã có câu trả lời: Đã đóng cửa 10 năm trước. Có thể trùng lặp: Lợi ích của việc sử dụng Boost.Phoenix là gì? Vì vậy, tôi bắt đầu đọc boost.
Tôi đang cố gắng lấy một ví dụ đơn giản bằng cách sử dụng Boost.Timer cho một số phép đo hiệu suất của đồng hồ bấm giờ, nhưng tôi không hiểu tại sao tôi không thể liên kết thành công Boost.Timer với Boost.Chrono. Tôi sử dụng đoạn script đơn giản sau để xây dựng từ nguồn
Tôi có một cái gì đó như thế này: enum EFood{ eMeat, eFruit }; class Food{ }; class Meat: public Food{ void someM
Ai đó có thể cho tôi biết, làm cách nào tôi có thể tăng cường :: Biến thể để xử lý các bản đồ không có thứ tự? bảng typedef boost::variant lut_value;unordered_map; Tôi nghĩ có một cái cho boo
Tôi đang bối rối về các vòng và đa giác trong Boost.Geometry. Trong tài liệu, không có đồ họa nào cho biết hình tròn là gì và hình đa giác là gì. Có ai có thể vẽ sơ đồ để giải thích sự khác biệt giữa hai khái niệm này không? Câu trả lời hay nhất là trong Boost.Geometry, đa giác được xác định
Tôi đang sử dụng boost.pool nhưng tôi không biết khi nào nên sử dụng boost::pool<>::malloc và boost::pool<>::ordered_malloc Vậy, boost::pool<>:
Tôi đang cố gắng sử dụng *boost::container::flat_set* thông qua *boost::fast_pool_allocator*. Tuy nhiên, tôi gặp lỗi biên dịch. Cảm ơn bạn rất nhiều vì ý kiến và đề xuất của bạn. Để làm nổi bật vấn đề này
sau_timer::sau_timer(int secs, timeparam f) : strnd(io), t(io, boost::posix_time::seconds(secs)
Tôi không thể hiểu tài liệu về hàm này, tôi đã thấy nhiều lần tie (ei,ei_end) = out_edges(*(vi+a),g); **g**::out_edge_iterator ei, ei_end;
Tôi muốn tuần tự hóa cấu trúc dữ liệu phân cấp trong C++. Dự án tôi đang thực hiện sử dụng boost, vì vậy tôi đang sử dụng boost::property_tree::ptree làm cấu trúc nút dữ liệu của mình. Chúng tôi có các nút thắt nâng cao như Người
Tôi cần một số trợ giúp để giải quyết ngoại lệ này, tôi đang triển khai plugin NPAPI để có thể sử dụng ổ cắm cục bộ từ tiện ích mở rộng trình duyệt, vì điều này tôi đang sử dụng khung Firebreath. Đối với ổ cắm và kết nối, tôi sử dụng Boost với các cuộc gọi không đồng bộ
Tôi đã thử sử dụng boost::bind với boost::factory nhưng không thành công. Tôi có lớp Zambas này với 4 tham số (2 chuỗi và 2 số nguyên) và lớp Zambas { publ
Tôi là một lập trình viên xuất sắc, rất giỏi!