小编MFn*_*Fnx的帖子

std::set 是否在内存中连续存储对象?

是否std::set将对象存储在连续内存中std::vector

我在网上找不到这个,cppreference 没有提到内存分配的细节。但我不明白为什么它不能使用连续内存,因此我的问题。

c++ set stdset

20
推荐指数
2
解决办法
2592
查看次数

std::pair<auto, auto> 返回类型

我在玩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)

c++ constexpr auto std-pair c++17

17
推荐指数
1
解决办法
1715
查看次数

Eigen是否承担锯齿?

矩阵乘法是Eigen中唯一在默认情况下采用别名的运算

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++ eigen

6
推荐指数
1
解决办法
99
查看次数

C++性能std :: array vs std :: vector

晚上好.

我知道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 …

c++ performance benchmarking stdvector stdarray

5
推荐指数
2
解决办法
1336
查看次数

不应该禁止使用私有类型吗?

考虑以下代码:

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::Bprivate。但是,从此以后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函数,则声明它没有任何意义。

c++ c++11 c++03

5
推荐指数
1
解决办法
152
查看次数