我正在研究一个类,我在查找类的一个元素中的值位置时遇到了一些问题。我已经按如下方式定义了我的课程:
typedef class Chrom
{
public:
vector<vector < int>> bit;
vector<vector < bool>> jobisconsidered;
vector<vector <float>> WaitingTime;
void variablesresize()
{
int i = 0, j, k;
float a;
std::vector<float> datapoints;
std::ifstream myfile("Input.dat", std::ios_base::in);
i = 0; //making zero counter of characters
myfile.open("Input.dat");//now we reread numerical values
while (!myfile.eof())
{
myfile >> a;
// cout << "i=" << i << '\n';
if (!myfile) // not an int
{
myfile.clear(); // clear error status
myfile.ignore(1); // skip one char at input
}
else
{
datapoints.push_back(a);
++i;
}
}
myfile.close();
Jobs = datapoints[0];
Machines = datapoints[1];
WaitingTime.resize(Machines);
bit.resize(Machines);
for (int i = 0; i < Machines - 1; ++i) WaitingTime[i].resize(Jobs);
bit[i].resize(Jobs);
}
}
} c;
c popcurrent[50];
在类中,bit是2D元素,如果我将其定义为m*n
,则行中的所有值都相同。但是,当我想在bit
中查找位置时,例如,如果popcurrent[0].bit
代表2行3列= { {3,2,1},{3,2,1} }
,我想找到第一个“{{1}的位置“在向量中是0和3
,我有问题。
具体来说,我使用以下命令尝试c++ search a vector for element first seen position:
popcurrent[0].bit[0][0]=3
但我得到以下错误:
auto p = std::lower_bound(popcurrent[0].bit.begin(), popcurrent[0].bit.end(), 1);
int position = p - popcurrent[0].bit.begin();
我知道一种方法是使用for和if循环。但我想知道是否还有更多的自动化方法,例如内置函数。
答案 0 :(得分:3)
我一开始并没有注意到它 - 那里有太多不相关的代码 - 但问题很简单:你正试图找到std::vector<int>
类型的第一个元素而不是小于int
类型的值。
popcurrent[0].bit.begin()
指向std::vector<std::vector<int>>
的第一个元素,即向量。没有&#34;少于&#34;用于比较整数向量和一个int的运算符。
答案 1 :(得分:1)
我想找到第一个&#34;
3
&#34;的位置。在向量中是0和popcurrent[0].bit[0][0] = 3
,我有问题。具体我试过了 c ++使用以下内容搜索元素首次看到位置的向量 命令:auto p=std::lower_bound(popcurrent[0].bit.begin(), popcurrent[0].bit.end(), 1); int position = p - popcurrent[0].bit.begin();
主要有两个问题:
问题 - 1: std::lower_bound
采用参数first
,last
,它们是定义部分有序范围的前向迭代器类型。在你的情况下(popcurrent[0].bit.begin(
)),你传递一个迭代器,它的尖头元素为一个整数向量(记住std::vector<std::vector<int>>
是一个向量数组{{1 } {}非整数)vector<int>
找不到std::lower_bound
的任何定义。这就是你的错误的原因,编译器在抱怨:
&#34; 嘿,我没有operator<
给定范围的专业化
或矢量,以实例化模板 &#34;
问题 - 2:你不能在这里使用operator<
,因为它需要一个严格排序的数组来二进制搜索已经提供的值。由于您提供了未分类的向量来检查,结果不会是正确的。请参阅以上链接以了解更多信息:
解决方案:您可以使用时间复杂度为std::find_if
的SEE LIVE HERE,std::lower_bound
与{{1}之间的距离最高为线性根据提供的first
,迭代器将搜索每个元素,直到找到匹配为止。如果您不想对类中的每个向量进行排序(这实际上是向量的三维数组),这可能是一种替代方法。
last
输出:
predicate