先看如下代码片段
#include <vecotr> #include <string> #include "boost/algorithm/string/split.hpp" #include "boost/algorithm/string/classification.hpp" #include "boost/algorithm/string.hpp" std::vector vStrArray; //里面存着一堆字符串,其中有一个字符串是这样的: " a.kbasdasdsad" for (auto a : vector) { boost::trim(a); }
#include #include #include "boost/algorithm/string/split.hpp" #include "boost/algorithm/string/classification.hpp" #include "boost/algorithm/string.hpp" std::vector vStrArray; //里面存着一堆字符串,其中有一个字符串是这样的: " a.kbasdasdsad" for (std::vector::iterator a = vector.begin(); a != vector.end(); ++a) { boost::trim(*a); }
编译环境是vs 2015 update 3
分别执行完以后会发现,A代码片段没有任何变化,B代码片段的” a.kbasdasdsad”变成了”a.kbasdasdsad”。
单步的时候发现,a变量在A代码片段中,实际上是已经对被修改了。后来网上查了几篇资料,怎么也没有找到对auto的详细说明。加上c++ 11每个编译器实现可能存在一定的差异,因此只能认为,在auto修饰的for循环里,变量使用了写时复用的方式来处理。
如果要对vector里面的值进行修改,还是只能使用最原始的迭代器方法。