Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.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/7/sqlite/3.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
为什么std::for_都是非修改序列操作? < >我刚才在C++标准中看到, STD::FoYYOR/是一个非修改的序列操作,与查找< /COD>,搜索> /Cuff>等等。这是否意味着应用于每个元素的函数不应修改它们?为什么呢?可能会出什么问题_C++_Stl_Standards_Foreach - Fatal编程技术网

为什么std::for_都是非修改序列操作? < >我刚才在C++标准中看到, STD::FoYYOR/是一个非修改的序列操作,与查找< /COD>,搜索> /Cuff>等等。这是否意味着应用于每个元素的函数不应修改它们?为什么呢?可能会出什么问题

为什么std::for_都是非修改序列操作? < >我刚才在C++标准中看到, STD::FoYYOR/是一个非修改的序列操作,与查找< /COD>,搜索> /Cuff>等等。这是否意味着应用于每个元素的函数不应修改它们?为什么呢?可能会出什么问题,c++,stl,standards,foreach,C++,Stl,Standards,Foreach,下面是一个示例代码,其中修改了序列。你能看出它有什么毛病吗 void foo(int & i) { i = 12; } int main() { std::vector<int> v; v.push_back(0); std::for_each(v.begin(), v.end(), foo); // v now contains 12 } void foo(int&i) { i=12; } int main() { std::向

下面是一个示例代码,其中修改了序列。你能看出它有什么毛病吗

void foo(int & i)
{
    i = 12;
}

int main()
{
    std::vector<int> v;
    v.push_back(0);

    std::for_each(v.begin(), v.end(), foo);
    // v now contains 12
}
void foo(int&i)
{
i=12;
}
int main()
{
std::向量v;
v、 推回(0);
std::for_each(v.begin()、v.end()、foo);
//v现在包含12个
}
我怀疑这只是一个解释问题,但我想听听你的意见


PS:我知道我可以对每个使用
std::transform
而不是
,但这不是重点。

很简单,你不能做出任何可能修改容器结构的更改。这是因为在一般情况下,修改容器会使所使用的迭代器无效

只要不改变容器的结构(例如容器中元素的顺序),就可以修改元素

[补充]


请注意,对于每个
都是“非修改”算法,似乎存在一些混淆。Stroustrup在勘误表中总结了这一令人困惑的情况,对于第四版的“C++编程语言,第三版”(CPL)有这样的说法:<代码> For每个/<代码>可以修改序列的元素():< /P> “for_each()算法被归类为非修改,因为它没有显式修改序列。但是,如果应用于非常量序列
,for_each()
可能会更改序列的元素。例如,请参阅11.9中的
否定()

CPL最初表示不允许为每个
传递给
的函数或函数对象修改传递给它的元素。然而,CPL是在标准最终确定之前编写和发布的,显然,在标准最终确定之前,对
for_each()
的限制已被取消

另见:

  • ()
  • 中提到的C++ LWG缺陷报告
我认为“非修改序列操作”意味着该操作不修改序列。但是操作可以修改容器元素

容器元素和序列的值-不同的东西。

见他们所说

LWG认为标准中没有禁止修改序列元素的函数对象。问题是,对于_,每个都在一个名为“非置换算法”的段落中,标题可能会令人困惑。非规范性说明应阐明这一点

但也要注意


他们似乎称之为“非修改”,因为for_本身并没有明确地修改序列的元素。

如上所述,for_被归类为“非修改算法”

STL的“变异”对应物是std::transform

由于您指出您知道可以使用std::transform,因此上述内容确实成为重点。它作为与阅读您的代码的人的交流点

如果我看到std::for_each,很明显,无论foo做什么,它都不会修改容器

我遵循的准则可以说是:

“如果您希望使用容器的元素执行一些不改变元素的任务,请使用std::for_


如果您希望使用容器的元素以某种系统的方式修改元素,或者在将以某种方式更改元素的任务中使用它们,请使用std::transform。“

是的,我刚刚找到了相同的问题列表。正如我所想,这只是一个解释的问题(但我真的认为他们应该加上这个说明)。是的,我也这么认为。它还不在n2800里。让我们看看下一稿有什么内容。由于便笺的状态是CD1,奇怪的是它已经不在了:)我怀疑他们删除了它,因为他们想为它想出一个概念。很好的发现!特别注意缺陷报告中的这一点:“Stepanov和Lee的原始STL文档明确禁止函数对象修改其参数”。我不知道。