find_if总是给出第一个元素而不是isOdd函数

时间:2017-12-14 16:24:31

标签: c++ stl

#include <iostream>
#include <vector>
#include <algorithm>
#include <time.h>
#include <iomanip>

using namespace std;

bool isOdd(int n)
{ 
    cout << "HELLO";  
    bool val  = ((n%2) == 1); 
    cout << val << endl;
    return val;
}

int main()
{
    srand(time(NULL));

    vector<int> myVec;
    myVec.reserve(20);

    for(int i = 0; i < 20; i++)
    {   
        myVec[i] = rand() % 100;
        cout << myVec[i] << " ";
    }   

    vector<int>::iterator q = std::find_if(myVec.begin(), myVec.end(), isOdd);

    cout << setw(3) << "first odd = " << *q << endl;

}

上面的程序总是输出向量的第一个数字,而不是在isOdd函数中。我是MacOSX用户,使用g++ odd.cpp

编译程序

请帮忙

3 个答案:

答案 0 :(得分:7)

问题在于以下几点:

 vector<int> myVec;
 myVec.reserve(20);

std::vector::reserve()为20个元素保留内存,但不会更改矢量大小。通过std::vector::operator[]访问这些元素似乎&#34;工作&#34;对你而言,当你访问超出范围的元素时,会导致UB。您可以检查是否用确认索引的std::vector::at()替换它。

只需将这两行替换为:

vector<int> myVec( 20 );

将创建20个元素等于0的向量。

注意:你的循环不应该使用幻数,应该写成:

for(size_t i = 0; i < myVec.size(); i++)

如果你写得正确,你会立即注意到这个问题。

注2:无法保证您将获得任何奇数,因此您必须验证迭代器,在您取消引用之前由std::find_if返回。

答案 1 :(得分:0)

由于reserve已分配所需内存且operator[]未检查索引范围,因此您没有崩溃。

在您的代码中std::find_if始终返回myVec.end(),因为当您仅使用reserved向量时,向量始终为零且myVec.begin() == myVec.end()

你正在引用一个end()的迭代器,所以它是未定义的行为,但是大多数STL库都会提到保留内存的开头,你在哪里&#34;第一个&#34;价值所在。

因此请reserve resize#include <iostream> #include <vector> #include <algorithm> #include <time.h> #include <iomanip> using namespace std; bool isOdd(int n) { cout << "HELLO"; bool val = ((n%2) == 1); cout << val << endl; return val; } int main() { srand(time(NULL)); vector<int> myVec(20); for(int i = 0; i < myVec.size(); i++) { myVec[i] = rand() % 100; cout << myVec[i] << " "; } vector<int>::iterator q = std::find_if(myVec.begin(), myVec.end(), isOdd); if (q != myVec.end()) { cout << setw(3) << "first odd = " << *q << endl; } else { cout << "Odd values not found!!!\n"; return 1; } return 0; } 或其他答案点一样。

要完全修复您的代码,它应如下所示:

a

答案 2 :(得分:0)

您可以使用push_back

 vector<int> myVec;

            for(int i = 0; i < 20; i++)
            {   
                myVec.push_back(rand() % 100);
                cout << myVec[i] << " ";
            }   

由于Push_back每次将向量的大小增加1,因此最终大小为20。