是否std::set将对象存储在连续内存中std::vector?
我在网上找不到这个,cppreference 没有提到内存分配的细节。但我不明白为什么它不能使用连续内存,因此我的问题。
我在玩autoin std::pair。在下面的代码中,函数f应该返回std::pair依赖于模板参数的类型。
一个工作示例:
例 1
template <unsigned S>
auto f()
{
if constexpr (S == 1)
return std::pair{1, 2}; // pair of ints
else if constexpr (S == 2)
return std::pair{1.0, 2.0}; // pair of doubles
else
return std::pair{0.0f, 0.0f}; // pair of floats
}
Run Code Online (Sandbox Code Playgroud)
这适用于 gcc 9.2、gcc 10.0、clang 9.0 和 clang 10.0。
接下来,std::pair为了清楚起见,我想明确地将返回类型写为 a :
例2
template <unsigned S>
std::pair<auto, auto> f()
{
if constexpr (S == 1)
return {1, …Run Code Online (Sandbox Code Playgroud) MatrixXf mat1(2,2);
mat1 << 1, 2, 4, 7;
MatrixXf mat2 = mat1;
auto result = mat1 * mat2;
Run Code Online (Sandbox Code Playgroud)
Eigen mat1 * mat2在临时矩阵中评估乘积,然后result在计算后将其用于初始化。如result右图所示,我们不需要别名:
MatrixXf result;
result.noalias() = mat1 * mat2;
Run Code Online (Sandbox Code Playgroud)
现在,将产品mat1 * mat2直接评估为result。
到目前为止,一切都很好。但是在这种情况下会发生什么呢?
template <typename T1, typename T2>
auto multiplication(const T1& A, const T2& B) // I'm using C++17, decltype not needed
{
return A*B;
}
int main()
{
auto result = multiplication(mat1, mat2); // say mat1 and mat2 …Run Code Online (Sandbox Code Playgroud) 晚上好.
我知道C风格的数组或std :: array并不比矢量快.我一直使用矢量(我使用它们很好).但是,我有一些情况,使用std :: array比使用std :: vector更好,我不知道为什么(用clang 7.0和gcc 8.2测试).
让我分享一个简单的代码:
#include <vector>
#include <array>
// some size constant
const size_t N = 100;
// some vectors and arrays
using vec = std::vector<double>;
using arr = std::array<double,3>;
// arrays are constructed faster here due to known size, but it is irrelevant
const vec v1 {1.0,-1.0,1.0};
const vec v2 {1.0,2.0,1.0};
const arr a1 {1.0,-1.0,1.0};
const arr a2 {1.0,2.0,1.0};
// vector to store combinations of vectors or arrays
std::vector<double> glob(N,0.0);
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.初始化变量的上述代码不包含在基准测试中.现在,让我们写一个函数元素(结合double …
考虑以下代码:
class A
{
struct B {};
std::vector<B> _vec;
public:
const std::vector<B>& get() const { return _vec; }
};
Run Code Online (Sandbox Code Playgroud)
请注意,这B在class 中是私有的A。上面的代码可以编译,但是get()从外部类调用时A,它不会:
const std::vector<A::B>& vec = get(); // does not compile
Run Code Online (Sandbox Code Playgroud)
确实A::B是private。但是,从此以后C++11,您可以简单地执行以下操作:
const auto& vec = get();
Run Code Online (Sandbox Code Playgroud)
完美地运作。
由于与上述相同的原因,您不能执行以下操作:
A::B obj;
Run Code Online (Sandbox Code Playgroud)
但是,由于存在一个public吸气剂,您可以从该吸气剂功能推导出类型。在这种情况下,可以执行以下操作:
using B = std::decay<decltype(C{}.get())>::type::value_type;
B obj;
Run Code Online (Sandbox Code Playgroud)
问题
我不确定如何提出我的问题。从C ++ 11开始(而不是之前),我实际上可以实例化为A::B后者,这对我来说似乎很奇怪private。而且,我认为我们可以打电话叫怪const auto& get()。有什么解释吗?不允许这样做不是更好吗?我应该申报A::B public吗?我觉得private如果需要像上面代码中那样的getter函数,则声明它没有任何意义。