【问题标题】:Looping over a container as a template将容器作为模板循环
【发布时间】:2015-10-19 04:07:45
【问题描述】:

我对 C++ 中的模板编程有点陌生,但遇到了困难。我正在尝试编写一段代码来循环容器和模板类型 T 中的元素。我所拥有的显然是错误的,但我认为应该理解这个想法。

template <typename Container, typename T >
Container<T> MyFunction(Container<T> input)
{
    T precedingElement = input[0];
    Container<T> output = input;       
    for(int i=1; i<input.size(); i++)
    {
        // Do some work on element in the container
        // Now update precedingElement
        precedingElement = input[i];
    }
    return output;
}

// Example
vector<float> a = [0, 1, 2, 3, 4, 5 ...];
vector<float> b = MyFunction(a);
// Another example
list<MyType> c = [object1, object2, ... ];
list<MyType> d = MyFunction(c)

提前感谢您的帮助。

【问题讨论】:

    标签: c++ metaprogramming template-meta-programming


    【解决方案1】:

    首先,通过const 引用接受您不想修改的函数参数,以避免潜在的昂贵副本: 模板 Container MyFunction(const Container& input)

    在下面的实现中,使用所有标准库容器都支持的迭代器跟踪元素,因此您可以在std::list&lt;&gt;s、std::vector&lt;&gt;s 甚至std::strings 上进行操作。

    {
        Container<T> output = input;
        Container<T>::const_iterator in_it = input.begin();
    
        for (Container<T>::iterator out_it = std::next(output.begin());
             out_it != output.end(); ++out_it, ++in_it)
            *out_it += *in_it;
    
        return output;
    }
    
    // Example
    vector<float> a = { 0, 1, 2, 3, 4, 5 ...};
    vector<float> b = MyFunction(a);
    // Another example
    list<MyType> c = { object1, object2, ... };
    list<MyType> d = MyFunction(c);
    

    【讨论】:

    • 如果我有向量 A = [ 0, 1, 2, 3, ...] 并且我想生成另一个向量 B ,其中元素 b_i 等于 a_i + a_(i-1)对于 i = 1、2、3 等等。
    • 那么你会在 for 循环内说 output[i] += input[i - 1];而不是上面的 output[i-1] = input[i];)。
    • 对于那个正确的例子和获得答案的最佳方法,我试图将其作为算法的一个例子,而不是添加数字的最佳方法。实际问题是展开阶段测量,它不能依赖于一种容器。很抱歉造成混乱。
    • “不能依赖于一种容器” - 很公平 - 我没有注意你的 list&lt;MyType&gt; 示例,而 std::list&lt;&gt;s 可以t 被随机访问(即使用[n] 表示法),所以我重写了代码以使用迭代器并解释了原因......
    • 你又是对的,我用错了列表。解决这个问题的迭代器方法是什么?这似乎更笼统。
    【解决方案2】:

    看起来precedingElement更新应该是precedingElement = input[i](它是元素类型,不是集合)

    【讨论】:

    • 你是对的,我的错。我从我的代码中复制并粘贴了它,类型 T 也是可索引的。这对我的观点没有帮助,对于复杂性感到抱歉。
    • 问题是vector本身不是一个类型,而是一个模板,你应该把它声明为模板模板参数:template&lt;template&lt;class&gt; Container, class T&gt;
    • 你能举个例子吗?我不确定我是否理解,谢谢
    • 在函数声明中使用template &lt; template&lt;typename&gt; Container, typename T &gt;Container&lt;T&gt; MyFunction(Container&lt;T&gt; input) {
    • 由于某种原因,我遇到了“模板容器,类型名T>”但“模板类容器>”的问题。去想,但我想也许是吧,谢谢你的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 2012-01-07
    • 2013-09-12
    相关资源
    最近更新 更多