gpt4 book ai didi

c++ - 在 C++ 中拆分对象 vector

转载 作者:行者123 更新时间:2023-11-27 23:53:31 25 4
gpt4 key购买 nike

我知道我的消息格式不正确,但我是新手所以无论如何请帮助我。我有两个类(class):父亲和儿子。在 Son 中,我有一个 int 和一个 string。在父亲中,我有一个儿子对象的 vector 。我怎样才能只访问由整数组成的 vector 部分和/或只由字符串组成的部分?非常感谢!


CLASS SON.H

#ifndef SON_H
#define SON_H
#include <iostream>
using namespace std;

class Son
{
public:
Son() {}
Son(int first, string second);
virtual ~Son();
int getFirst() const;
string getSecond() const;
private:
int _first_parameter;
string _second_parameter;
};

#endif // SON_H

类儿子.CPP

#include "son.h"

Son::Son(int first, string second)
{
_first_parameter=first;
_second_parameter=second;
}

Son::~Son()
{
//dtor
}

int Son::getFirst() const
{
return _first_parameter;
}

string Son::getSecond() const
{
return _second_parameter;
}

类长.H

#ifndef FATHER_H
#define FATHER_H
#include <vector>
#include "son.h"

class Father
{
public:
Father() {}
virtual ~Father();
void filling();
private:
vector<Son> _access_vector;
void _printIntegers(vector<int> v);
void _printStrings(vector<string> v);
};

#endif // FATHER_H

类长.CPP

#include "father.h"

Father::~Father()
{
//dtor
}

void Father::filling()
{
int temp_first_param;
string temp_second_param;
cout<<"Insert integer: "<<endl;
cin>>temp_first_param;
cout<<"Insert text"<<endl;
cin>>temp_second_param;
_access_vector.push_back(Son(temp_first_param, temp_second_param));
_printIntegers(_access_vector.getFirst()); /// Here I want to take just the vector of integers
_printStrings(_access_vector.getSecond()); /// Here I want to take just the vector of strings
}

void Father::_printIntegers(vector<int> v)
{
for(unsigned i=0; i<v.size(); ++i)
cout<<v[i]<<endl;
}

void Father::_printStrings(vector<string> v)
{
for(unsigned i=0; i<v.size(); ++i)
{
cout<<v[i]<<endl;
}
}

编译器错误:

||=== Build: Debug in Vector_access_experiment (compiler: GNU GCC Compiler) ===| C:\Users\Alessandro\Documents\CodeBlocks\Vector_access_experiment\src\father.cpp||In member function 'void Father::filling()':| C:\Users\Alessandro\Documents\CodeBlocks\Vector_access_experiment\src\father.cpp|17|error: 'class std::vector' has no member named 'getFirst'| C:\Users\Alessandro\Documents\CodeBlocks\Vector_access_experiment\src\father.cpp|18|error: 'class std::vector' has no member named 'getSecond'| ||=== Build failed: 2 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

最佳答案

评论中给出了实际答案,现在如何解决你手头的问题和一些解释:

std::vector 包装一个数组。这意味着,在内存中, vector 中的数据是连续的。 vec[6] 位于内存中 vec[5] + sizeof(type) 的位置。

在您的例子中,由于 Son 存储了一个字符串和一个 int,这意味着内存看起来像这样:

条目 0 的 int,条目 0 的字符串长度,条目 0 的字符串 char 指针,条目 1 的 int,条目 1 的字符串长度...

你试图得到的是一个看起来像这样的结构:

条目 0 的整数,条目 1 的整数,...

这显然不在那里。创建它需要计算时间,没有办法解决这个问题。

由于您的方法 printIntegers 无论如何都会复制一些 vector (因为您不通过引用调用),您可以通过创建新的 vector 来简单地解决这个问题,该 vector 通过迭代原始 vector 来存储部分数据,但这是糟糕的设计。

我建议:

void Father::_printIntegers(const vector<Son>& v) const
{
for(unsigned i=0; i<v.size(); ++i){
cout<<v[i].getFirst()<<endl;
}
}

(还添加了引用调用和 const 关键字,使用它们!)

您还可以将 Son 合并到 Father 中,在 Father 中创建两个 vector ,这在某些情况下可能有意义,具体取决于您的上下文。

也就是说,就您的设计而言——如果将 Son 硬分为整数和字符串,则 Son 可能是一个弱类。类并不意味着仅仅是数据持有者。最好的事情是孙正义自己打印。父亲应该不知道儿子有哪些成员——明白我的意思吗?也就是说,这也取决于上下文,有时您想要的仅仅是数据持有者。

编辑:对我的回答的一些评论提出了一个有效的观点,这里是没有参数的方法:

void Father::_printIntegers() const
{
for(unsigned i=0; i<v.size(); ++i){
cout<<_access_vector[i].getFirst()<<endl;
}
}

关于c++ - 在 C++ 中拆分对象 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44385464/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com