如何找到向量中元素的最大和最小索引?

时间:2014-11-16 08:40:27

标签: c++ vector indexing

我的数据集包含数千个值,如下所示:

1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 6, 6, 6, 6, 6

数据的属性:

1)从1开始,这些值是连续的整数。

2)每个值的数量并不总是相同。

目标:

查找向量中每个值的最小和最大索引。预期结果应为:

 minimum index: [0, 3,5,9,14,16]
 maximum index: [2, 4,8,13,15,20]

有人可以给我一个简单的解决方案吗? 感谢

2 个答案:

答案 0 :(得分:0)

以下是您的问题的伪代码:

1.创建map<int,pair<int,int>的地图。键是来自向量的值,键的对应值是起始索引和结束索引。

2.对于向量中的每个键,检查对的第一个值是否存在。

 IF yes:
   then update the second value with current index.
  else 
   update the first value with current index.

3.最后遍历所有键值对。

现在,您可以直接访问任何密钥的开头和结尾。

答案 1 :(得分:0)

@cauchy:对的地图会比它需要的更慢,更复杂。将结果转储到stdout实际上需要比简单解决方案更多的行:

// assuming compiler doesn't support initialization lists for std::vector:
int ai[] = { 1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 6, 6, 6, 6, 6, 7 };
std::vector<int> values(ai, ai+(sizeof(ai)/sizeof(ai[0])));

std::vector<int> boundaries;
int prevValue = values[0] - 1;
for (size_t i = 0; i < values.size(); i++){
    if (prevValue != values[i]){
        boundaries.push_back(i);
        prevValue = values[i];
    }
}

// show lower boundaries
std::cout << "[" ;
for (size_t i = 0; i < boundaries.size(); i++){
    std::cout << " " << boundaries[i];
}
std::cout << "]" << std::endl;

// show upper boundaries
std::cout << "[" ;
for (size_t  i = 1; i < boundaries.size(); i++){
    std::cout << " " << boundaries[i] - 1;
}
std::cout << " " << values.size() - 1;
std::cout << " ]" << std::endl;

注意,我们只需要每个值数组元素 VA [n] 的下边界索引 LB [i] ,因为上边界 UB [i] VA [n] 将始终为 LB [i + 1] - 1 ,但 UB [last] 除外根据定义, VA 的最大有效索引。