指针列表的总和

时间:2013-12-20 10:43:46

标签: c++ list

我被指针数组变得疯狂.. 如果我有一个如下定义的列表:

std::list<float*> total;

任何人都可以告诉我如何将他们的元素互相添加吗?

for(int i = 0; i < total.size(); i++)
{
     // add elements
}

像指针数组一样。我不知道如何总结它们。我是c ++编程的新手。

编辑:

感谢您的所有答案,但由于此指针指向Mat(opencv /图像处理)似乎在我的情况下不起作用:(

5 个答案:

答案 0 :(得分:3)

std::list<float*> total;

float sum = 0.0f;
for ( float *p : total ) sum += *p;

或者

for ( list<float *>::size_type i = 0; i < total.size(); i++ ) sum += *total[i];

或者

float sum = std::accumulate( total.begin(), total.end(), 0.0f, 
                             []( float acc, float *value ) { return ( acc += *value ); } );

EDIT。第二个例子无效。列表没有下标运算符。所以我将其改为以下

for ( auto it = total.begin(); it != total.end(); ++it ) sum += **it;

答案 1 :(得分:2)

在访问列表时,您需要使用*运算符取消引用指针,如下所示:

*(total[i])

然而,将项目存储为std::list<float>要容易得多 - 默认情况下,STL容器默认将其内容粘贴在堆上。

答案 2 :(得分:2)

您最好的方法是使用迭代器:如果您更改容器类型,则不需要进行太多重构:

std::list<float*> total;
float sum = 0.0f;

for (std::list<float*>::const_iterator it = total.begin(); it != total.end(); ++it)
{
    sum += **it;
}

请注意双重取消引用:*it会返回容器(在您的情况下为float*),因此您需要再次取消引用以提取实际的float

如果您有一个std::list<float>(这会更正常),那么您可以轻松地使用累加器

<强> C ++ 11

C ++ 11增加了可以在这里利用的新功能。

1)重新定义auto。编译器将定义适当的类型。你可以写

for (auto it = total.begin(); it != total.end(); ++it)

显着降低了维护开销。

2) for-ranges。如果.begin()和.end()定义良好,那么你可以编写

for (auto it : total)

答案 3 :(得分:1)

float sum = 0f;
for(float* element : list)
{
    sum += *element; // for every element, add the value at the address pointed by the element.
}

答案 4 :(得分:0)

std::list表示(双重)链接列表,因此您应该使用基于范围的for循环(如果您正在使用c ++ 11支持进行编译)或迭代器来循环遍历元素。

至于你的,每个元素都是一个float的指针/引用,所以要访问该值,你需要取消引用指针。以下是基于范围的for循环结构的示例:

float sum = 0;

for (float* element : total) {
    sum += *element;
}