数组,vector新老版本写法:
static void newVersionFor() {
MyVector vv;
for(auto v : vv) {
}
int ids[] = {1, 2, 3, 4, 5};
std::cout << "new version ";
for (auto v : ids) {
std::cout << v << " ";
}
std::cout << std::endl; // "\n";
std::cout << "old version ";
// old version
for (int i = 0; i < sizeof(ids) / sizeof(int) / 2; ++i) {
std::cout << ids[i] << " ";
}
std::cout << std::endl; // "\n";
std::vector<int> group;
for (int i = 0; i < 4; ++i) group.push_back(i);
// auto version
for(std::vector<int>::const_iterator iter = group.begin(), iterEnd = group.end();
iter != iterEnd; ++iter) {
std::cout << *iter << " ";
}
std::cout << std::endl;
for(size_t i = 0, size = group.size(); i < size; ++i) {
std::cout << group[i] << " ";
}
std::cout << std::endl;
std::cout << "vector verion : ";
for (auto v : group) {
v = v * v;
}
std::cout << std::endl;
for (auto& v : group) {
v = v * v;
}
for (const auto& v : group) {
}
}
当需要修改range中元素,用for(auto& x:range)
当vector返回临时对象,使用auto&会编译错误,临时对象不能绑在non-const l-value reference (左值引用)需使用auto&&,初始化右值时也可捕获
- 想要拷贝元素:for(auto x:range)
- 想要修改元素 : for(auto &&x:range)
- 想要只读元素:for(const auto& x:range)
新版本类中定义了begin和end函数就能用for(auto…)
class MyVector {
public:
using GroupType = std::vector<int>;
//typedef std::vector<int> GroupType;
//GroupType::iterator begin() { return m_group.begin();}
//GroupType::iterator end() { return m_group.end();}
public:
GroupType m_group;
};
MyVector::GroupType::iterator begin(MyVector& v) {
return v.m_group.begin();
}
MyVector::GroupType::iterator end(MyVector& v) {
return v.m_group.end();
}