这样就不担心类型转换带来的副作用。for(string::size_type ix = 0; ix != str.size(); ++ix) str[ix] = '*';
其实在一般的系统中,string::size_type 和 size_t 是同一种类型,即一种unsigned类型,我们可以直接使用下标对string对象进行操作。
在我们没有对string对象进行初始化时,编译器自动为我们将实例初始化为空字符串。
在使用vector 容器时,int类型的容器,若不进行初始化,编译器将为我们初始化每一个变量为0 , 当我们要使用索引时 , 应该这样定义之 :
vector 的特性之一就是动态增长。即vector::push_back() 具有常数时间的复杂度。 用下标进行初始赋值是无效的,可能会引发运行是严重错误(这种错误由程序员负责!)。所以,应该使用如下的方法:vector<int>::size_type ix ; //ok vector::size_type ix ; //error
使用vector自带的方法进行动态扩展。for (vector<int>::size_type ix = 0 ; ix != 10 ; ++ix) { cin >> temp ; ivecl.push_back (temp) ; }
建议使用迭代器对容器中的元素进行访问。因为可以使用下标访问的容器很少,而且尽管可以,也推荐使用迭代器。
实际上迭代器就是一个指针, 指向每一个元素,无论什么类型,加一以后移动一个元素的内存字节大小。
由容器的end方法返回的值不指向实际存在的元素,即最后一个元素的后面一个元素。它只是起一个哨兵的作用,告诉我们对这个容器已经处理完了。
vector<int> temp(10 , 1) ; vector<int>::iterator iter = temp.begin() ; //既然是引用,那么值应该是一个地址的,为什么不能直接用cout输出?估计是cout的原因,用printf可以的, printf ("Begin = %p \n Begin +1 = %p \n" , iter , iter+1 ) ; cout << sizeof (iter) << endl ; printf ("begin = %p value = %d \nbegin+1 = %p value = %d\n" , iter ,*iter , \ iter+1 , *(iter+1)) ; //输出: Begin = 0x112e010 Begin+1 = 0x112e014 8 begin = 0xb15010 value = 1 begin+1 = 0xb15014 value = 1 ///可以看到,这个是指针类型喽, 我是64位操作系统,所以指针是8byte ///大家可以吧int换成double试试, 结果相应的就变了Begin 和 Begin +1 之间就相隔8字节了, 但是指针的sizeof还是8