我是C++语言的新手.我已经开始使用向量,并且已经注意到在我看到的所有代码中通过索引迭代通过向量,for循环的第一个参数总是基于向量.在Java中,我可以使用ArrayList执行类似的操作:
for(int i=0; i < vector.size(); i++){
vector[i].doSomething();
}
Run Code Online (Sandbox Code Playgroud)
有没有理由我在C++中没有看到这个?这是不好的做法吗?
我需要向后移动一个数组,所以我有这样的代码:
for (int i = myArray.Length - 1; i >= 0; i--)
{
// Do something
myArray[i] = 42;
}
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法呢?
更新:我希望C#可能有一些内置机制,如:
foreachbackwards (int i in myArray)
{
// so easy
}
Run Code Online (Sandbox Code Playgroud)
更新2:有是更好的方法.符文获奖:
for (int i = myArray.Length; i-- > 0; )
{
//do something
}
//or
for (int i = myArray.Length; i --> 0; )
{
// do something
}
Run Code Online (Sandbox Code Playgroud)
在常规C中看起来更好(感谢Twotymz):
for (int i = lengthOfArray; i--; )
{
//do something
}
Run Code Online (Sandbox Code Playgroud) 我在这里和其他地方读过,当你使用索引迭代std :: vector时,你应该:
std::vector <int> x(20,1);
for (std::vector<int>::size_type i = 0; i < x.size(); i++){
x[i]+=3;
}
Run Code Online (Sandbox Code Playgroud)
但是,如果您正在迭代两个不同类型的向量,那该怎么办:
std::vector <int> x(20,1);
std::vector <double> y(20,1.0);
for (std::vector<int>::size_type i = 0; i < x.size(); i++){
x[i]+=3;
y[i]+=3.0;
}
Run Code Online (Sandbox Code Playgroud)
假设这样做是否安全
std::vector<int>::size_type
与...的类型相同
std::vector<double>::size_type
Run Code Online (Sandbox Code Playgroud)
?
使用std :: size_t会安全吗?
谢谢.
我通常以这种方式迭代一个向量:
for (int i = 0; i < myVector.size(); i++) {
Element* e = myVector[i];
}
Run Code Online (Sandbox Code Playgroud)
但是编译器通常会给我这个警告:
warning: C4018: '<' : signed/unsigned mismatch
Run Code Online (Sandbox Code Playgroud)
所以,如果a int不正确,索引应该是哪种类型?vector :: size()似乎是"size_type"类型,但我宁愿使用更有意义的类型.有什么建议吗?
我想遍历相反方向的向量值.如您所知,向量的大小为size_t.当我使用以下代码时:
for(size_t r=m.size()-1; r >= 0; r--)
{
x[r] = f[r];
for(size_t c = r+1; c < m.size(); c++)
{
x[r] -= m[r][c] * x[c];
}
}
Run Code Online (Sandbox Code Playgroud)
我将超出向量的范围,因为在递减r = 0之后r将变为4294967295.
我没有改变r的类型,因为在我的项目中,我将警告视为错误,因此它应该是size_t或者我应该将它转换为不感兴趣的.
Johannes Schaub 在这里声称
对于您不知道其定义的迭代器,请始终使用前缀增量形式。这将确保您的代码尽可能地通用。
for(std::vector<T>::iterator it = v.begin(); it != v.end(); ++it) {
/* std::cout << *it; ... */
}
Run Code Online (Sandbox Code Playgroud)
为什么不首先迭代它,然后开始循环(在v.begin()+ 1)?
很明显,2D阵列的行主要形式是存储的单个阵列,使得不同的行按顺序排列.
要遍历2d数组的任何元素,我总是可以这样做:
int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};
for(int i=0;i<3*3;i++){
cout<<*(*a+i)<<" "; //row major form concept where i<m*n;
}
Run Code Online (Sandbox Code Playgroud)
得到:
1 2 3 4 5 6 7 8 9
Run Code Online (Sandbox Code Playgroud)
它完全适合我,但每当我使用向量执行此操作时,它会抛出一个错误:
vector<vector<int> > v={{1,2,3},{4,5,6},{7,8,9}};
int m=v.size();
int n=v[0].size();
for(int i=0;i<m*n;i++){
cout<<*(*v+i)<<" ";
}
Run Code Online (Sandbox Code Playgroud)
它给 :
no match for ‘operator*’ (operand type is ‘std::vector<std::vector<int> >)
Run Code Online (Sandbox Code Playgroud)
我希望向量确实遵循行主要形式概念作为数组.如果是,那么在向量的情况下,行大调的替代方法是什么?
我有一个矢量:
std::vector<std::pair<int, long> > v;
v.push_back(std::make_pair(1, 2L));
etc...
Run Code Online (Sandbox Code Playgroud)
我怎样才能遍历它并从中获取int和long元素?