Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
数值参数化集合的模板与构造函数参数 我对C++模板比较新,正在实现一些数值例程。特别是,我一直在浏览一些代码,这些代码的风格是,如果要定义一个向量,它将是 template <class Field> class Vector2 { private: std::vector<Field> container; public: Vector2(size_t size) : container(std::vector<Field>(size, Field(0))) {} Vector2(const Vector2<Field> &source) : container(source.container) {} Field & operator[](size_t index) { return container.at(index); } const Field & operator[](size_t index) const { return container.at(index); } Vector2<Field> operator+( const Vector2<Field> & rhs) const { if (rhs.container.size() != container.size()) throw new std::invalid_argument("wrong size"); Vector2<Field> sum(*this); for (int i = 0; i < container.size(); i++) sum[i] += rhs[i]; return sum; } }; 模板 类向量2 { 私人: 载体容器; 公众: Vector2(大小):容器(std::vector(大小,字段(0)){} Vector2(constvector2&source):容器(source.container){} 字段和运算符[](大小索引){return container.at(索引);} 常量字段和运算符[](大小索引)常量{return container.at(索引);} 向量2运算符+(常量向量2和rhs)常量{ if(rhs.container.size()!=container.size()) 抛出新std::无效的_参数(“错误大小”); 向量2和(*此); 对于(int i=0;i_C++_Templates - Fatal编程技术网

数值参数化集合的模板与构造函数参数 我对C++模板比较新,正在实现一些数值例程。特别是,我一直在浏览一些代码,这些代码的风格是,如果要定义一个向量,它将是 template <class Field> class Vector2 { private: std::vector<Field> container; public: Vector2(size_t size) : container(std::vector<Field>(size, Field(0))) {} Vector2(const Vector2<Field> &source) : container(source.container) {} Field & operator[](size_t index) { return container.at(index); } const Field & operator[](size_t index) const { return container.at(index); } Vector2<Field> operator+( const Vector2<Field> & rhs) const { if (rhs.container.size() != container.size()) throw new std::invalid_argument("wrong size"); Vector2<Field> sum(*this); for (int i = 0; i < container.size(); i++) sum[i] += rhs[i]; return sum; } }; 模板 类向量2 { 私人: 载体容器; 公众: Vector2(大小):容器(std::vector(大小,字段(0)){} Vector2(constvector2&source):容器(source.container){} 字段和运算符[](大小索引){return container.at(索引);} 常量字段和运算符[](大小索引)常量{return container.at(索引);} 向量2运算符+(常量向量2和rhs)常量{ if(rhs.container.size()!=container.size()) 抛出新std::无效的_参数(“错误大小”); 向量2和(*此); 对于(int i=0;i

数值参数化集合的模板与构造函数参数 我对C++模板比较新,正在实现一些数值例程。特别是,我一直在浏览一些代码,这些代码的风格是,如果要定义一个向量,它将是 template <class Field> class Vector2 { private: std::vector<Field> container; public: Vector2(size_t size) : container(std::vector<Field>(size, Field(0))) {} Vector2(const Vector2<Field> &source) : container(source.container) {} Field & operator[](size_t index) { return container.at(index); } const Field & operator[](size_t index) const { return container.at(index); } Vector2<Field> operator+( const Vector2<Field> & rhs) const { if (rhs.container.size() != container.size()) throw new std::invalid_argument("wrong size"); Vector2<Field> sum(*this); for (int i = 0; i < container.size(); i++) sum[i] += rhs[i]; return sum; } }; 模板 类向量2 { 私人: 载体容器; 公众: Vector2(大小):容器(std::vector(大小,字段(0)){} Vector2(constvector2&source):容器(source.container){} 字段和运算符[](大小索引){return container.at(索引);} 常量字段和运算符[](大小索引)常量{return container.at(索引);} 向量2运算符+(常量向量2和rhs)常量{ if(rhs.container.size()!=container.size()) 抛出新std::无效的_参数(“错误大小”); 向量2和(*此); 对于(int i=0;i,c++,templates,C++,Templates,但是,如果我正在设计类模板,我会选择在模板参数中指定大小: template <int size, class Field> class Vector1 { private: std::vector<Field> container; public: Vector1() : container(std::vector<Field>(size, Field(0))) {} Vector1(const Vector1<

但是,如果我正在设计类模板,我会选择在模板参数中指定大小:

template <int size, class Field>
class Vector1
{
    private:
    std::vector<Field> container;

    public:
    Vector1() : container(std::vector<Field>(size, Field(0))) {}
    Vector1(const Vector1<size, Field> &source) : container(source.container) {}

    Field & operator[](size_t index) { return container.at(index); }
    const Field & operator[](size_t index) const { return container.at(index); }

    Vector1<size, Field> operator+( const Vector1<size, Field> & rhs) const {
        Vector1<size, Field> sum;
        for (int i = 0; i < size; i++)
            sum[i] += rhs[i];
        return sum;
    }
};
模板
类向量1
{
私人:
载体容器;
公众:
Vector1():容器(std::vector(大小,字段(0)){}
Vector1(constvector1&source):容器(source.container){}
字段和运算符[](大小索引){return container.at(索引);}
常量字段和运算符[](大小索引)常量{return container.at(索引);}
向量1运算符+(常量向量1和rhs)常量{
向量1和;
对于(int i=0;i
我的想法是,这将阻止像添加两个不同维度的向量这样的事情,因为它们是不同的类。特别是

Vector1<double> a (3);
Vector1<double> b (4);
Vector1<double> c = a + b;
vector1A(3);
向量1b(4);
向量1c=a+b;
还需要运行时检查大小

Vector2<3,double> a;
Vector2<4,double> b;
Vector2<5,double> c = a + b;
vector2a;
矢量2b;
向量2c=a+b;
甚至不会编译。因为这段代码是数值分析包的一部分,所以执行速度至关重要,我必须假设作者会考虑这些事情。此样式在整个代码中用于向量、矩阵和其他对象,这些对象将被解释为数值参数化集的元素(即不同维度的向量空间)

所以我的问题是,

与模板参数方法相比,是否有任何执行速度方面的考虑因素意味着首选构造函数参数方法


当然。如果向量大小是运行时参数,则二进制操作必须在运行时检查操作数大小是否一致

理想情况下,C++数值包应该提供具有运行时指定大小和编译时间指定大小的模板,并且它们应该是可互换的。在编译时指定大小只能提高性能

您可以通过将给定实现中的
std::vector
替换为
std::array
/
boost::array
来实现您的建议。如果模板参数仅用于定义运行时参数,则不会获得任何结果

i、 e.变维向量空间

如果维度在编译时未知,则它不能是模板参数。句号


模板在编译时更强大,但在运行时会牺牲一些灵活性。

这个类有什么意义?@Seth;问题的关键是要在数值线性代数中使用对象。我只是重读了这个问题,看到了问题的实质。以前,我想知道
Vector2
类的意义是什么,但现在我看到它只是一个示例。在这个示例中,不使用模板不会更灵活,因为您只需将大小检查移动到运行时,这当然会更慢,无论多么微小。