相关疑难解决方法(0)

使用'for'循环遍历C++ Vector

我是C++语言的新手.我已经开始使用向量,并且已经注意到在我看到的所有代码中通过索引迭代通过向量,for循环的第一个参数总是基于向量.在Java中,我可以使用ArrayList执行类似的操作:

for(int i=0; i < vector.size(); i++){
   vector[i].doSomething();
}
Run Code Online (Sandbox Code Playgroud)

有没有理由我在C++中没有看到这个?这是不好的做法吗?

c++ iterator for-loop coding-style

119
推荐指数
11
解决办法
39万
查看次数

在C/C#/ 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)

c c# c++

92
推荐指数
6
解决办法
13万
查看次数

迭代多个std :: vector

我在这里和其他地方读过,当你使用索引迭代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会安全吗?

谢谢.

c++ iterator stl

10
推荐指数
1
解决办法
5561
查看次数

迭代向量的元素时,索引类型应该是什么?

我通常以这种方式迭代一个向量:

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"类型,但我宁愿使用更有意义的类型.有什么建议吗?

c++ indexing types loops stdvector

10
推荐指数
1
解决办法
7212
查看次数

使用size_t值以反方向遍历向量

我想遍历相反方向的向量值.如您所知,向量的大小为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或者我应该将它转换为不感兴趣的.

c++ vector

4
推荐指数
1
解决办法
447
查看次数

为什么对迭代器使用前缀增量形式?

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)?

c++ iterator

4
推荐指数
2
解决办法
1092
查看次数

向量是否存在行主要形式?

很明显,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)

我希望向量确实遵循行主要形式概念作为数组.如果是,那么在向量的情况下,行大调的替代方法是什么?

c++ pointers vector std multidimensional-array

4
推荐指数
1
解决办法
169
查看次数

在C++中迭代一个向量

我有一个矢量:

std::vector<std::pair<int, long> > v;
v.push_back(std::make_pair(1, 2L));
etc...
Run Code Online (Sandbox Code Playgroud)

我怎样才能遍历它并从中获取int和long元素?

c++

-2
推荐指数
1
解决办法
393
查看次数