我被指针数组变得疯狂.. 如果我有一个如下定义的列表:
std::list<float*> total;
任何人都可以告诉我如何将他们的元素互相添加吗?
for(int i = 0; i < total.size(); i++)
{
// add elements
}
像指针数组一样。我不知道如何总结它们。我是c ++编程的新手。
编辑:
感谢您的所有答案,但由于此指针指向Mat(opencv /图像处理)似乎在我的情况下不起作用:(
答案 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;
}