繁体   English   中英

C ++ rand不适用于属性初始值设定项

[英]C++ rand doesn't work with attribute initializer

我是C语言的新手,有一些C语言的经验,为了学习它我在做作业的同时测试了一些东西。 我现在有

#define MAX_OBJS 4

using namespace std;

class Object {
    public:
        int x, rand;

        Object(int y) {
            x = y;
            rand = rand() % 5;
        };
};

class Many {
    public:
        vector<Object> obj_list;

    Many(int n): obj_list (MAX_OBJS, n) {}
};

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

    Many many(42);

    cout << "Example: looking for " << many.obj_list.back().rand "\n";

    vector<Object>::iterator j;
    Object t = many.obj_list.back();
    for (j = many.obj_list.begin(); j != many.obj_list.end(); j++) {
/*A*/   cout << j->rand << "\n";
/*B*/   if (&(*j) == &t)
/*C*/       cout << "Found!" << "\n";
    }

    return EXIT_SUCCESS;
}

从这段代码中,我可以说

  1. 我读到时间(0)可能会改变一些结果,但没有改变。
  2. 是的,我希望在实例化时获得一个Many对象来创建它的Object向量,向量初始化其所有MAX_OBJS元素x属性值为n
  3. 我试图制作一些代码来找到一个给定的元素,在这种情况下是最后一个,在某个向量中(在这种情况下,与元素相同)。 我尝试了一些像findfind_if这样的东西,没有成功。

我想对我的问题提出一些建议/帮助

  1. 线A)打印相同的数字(随机的)MAX_OBJS次
  2. 我不知道比B中更好的比较对象的方法
  3. 线C)永远不会打印出“发现!”

即使有@Nawaz建议, 发现也行不通。 编译说:

/usr/include/c++/4.5/bits/stl_algo.h:在函数' RandomAccessIterator std :: _find(_RandomAccessIterator,_RandomAccessIterator,const _Tp&,std :: random_access_iterator_tag)[with _RandomAccessIterator = __gnu_cxx :: __ normal_iterator>,_Tp = Object] “:

/usr/include/c++/4.5/bits/stl_algo.h:4209:45:从'_IIter std :: find(_IIter,_IIter,const _Tp&)[与_IIter = __gnu_cxx :: __ normal_iterator>,_Tp = Object]实例化

../src/Many.cpp:48:74:从这里实例化

/usr/include/c++/4.5/bits/stl_algo.h:158:4:错误:'_ first '中的'operator =='不匹配 _gnu_cxx :: __ normal_iterator <_Iterator,_Container> :: operator * with _Iterator = Object *,_ Container = std :: vector,__ gn_cxx :: __ normal_iterator <_Iterator,_Container> :: reference = Object&== __val'

/usr/include/c++/4.5/bits/stl_algo.h:4209:45:从'_IIter std :: find(_IIter,_IIter,const _Tp&)[与_IIter = __gnu_cxx :: __ normal_iterator>,_Tp = Object]实例化

../src/Many.cpp:48:74:从这里实例化

/usr/include/c++/4.5/bits/stl_algo.h:162:4:错误:'_ first '中的'operator =='不匹配 _gnu_cxx :: __ normal_iterator <_Iterator,_Container> :: operator * with _Iterator = Object *,_ Container = std :: vector,__ gn_cxx :: __ normal_iterator <_Iterator,_Container> :: reference = Object&== __val'

/usr/include/c++/4.5/bits/stl_algo.h:166:4:错误:'_ first '中的'operator =='不匹配 _gnu_cxx :: __ normal_iterator <_Iterator,_Container> :: operator * with _Iterator = Object *,_ Container = std :: vector,__ gn_cxx :: __ normal_iterator <_Iterator,_Container> :: reference = Object&== __val'

/usr/include/c++/4.5/bits/stl_algo.h:170:4:错误:'_ first '中的'operator =='不匹配 _gnu_cxx :: __ normal_iterator <_Iterator,_Container> :: operator * with _Iterator = Object *,_ Container = std :: vector,__ gn_cxx :: __ normal_iterator <_Iterator,_Container> :: reference = Object&== __val'

/usr/include/c++/4.5/bits/stl_algo.h:178:4:错误:'_ first '中的'operator =='不匹配 _gnu_cxx :: __ normal_iterator <_Iterator,_Container> :: operator * with _Iterator = Object *,_ Container = std :: vector,__ gn_cxx :: __ normal_iterator <_Iterator,_Container> :: reference = Object&== __val'

/usr/include/c++/4.5/bits/stl_algo.h:182:4:错误:'_ first '中的'operator =='不匹配 _gnu_cxx :: __ normal_iterator <_Iterator,_Container> :: operator * with _Iterator = Object *,_ Container = std :: vector,__ gn_cxx :: __ normal_iterator <_Iterator,_Container> :: reference = Object&== __val'

/usr/include/c++/4.5/bits/stl_algo.h:186:4:错误:'_ first '中的'operator =='不匹配 _gnu_cxx :: __ normal_iterator <_Iterator,_Container> :: operator * with _Iterator = Object *,_ Container = std :: vector,__ gn_cxx :: __ normal_iterator <_Iterator,_Container> :: reference = Object&== __val'


谢谢!

if (&(*j) == &t)

您正在比较上述if条件中对象的地址。 但是以下行生成了原始对象的副本:

Object t = many.obj_list.back();

复制意味着t与列表中的对象不同。 因此,您的程序永远不会打印Found!

我想你需要把它写成:

Object & t = many.obj_list.back();
    // ^ note this!

它存储对象的引用。 它不会在obj_list复制原始对象。


顺便问一下,为什么不使用<algorithm>头文件中的std::find

#include <algorithm>

std::vector<Object>::iterator it = std::find(many.obj_list.begin(), many.obj_list.end(), t)
if ( it != many.obj_list.end())
     std::cout << "Found!"<< std::endl;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM