C++ 中是否有任何 STL/Boost 函数可以让我找到向量中所有唯一元素的索引?
我见过很多找到独特元素的解决方案,但我需要它们的索引。
vector<int> v = { 1,1,1, 2,2,2,2, 3, 3, ,4,5,5,5,5,5,5 };// already sorted
Run Code Online (Sandbox Code Playgroud)
要么我需要唯一元素的第一个索引
vector<int> unique_index={0,3,7,9,10};
Run Code Online (Sandbox Code Playgroud)
或者我需要唯一元素的最后一个索引
vector<int> unique_index={2,6,8,9,15};
Run Code Online (Sandbox Code Playgroud)
一种简单的方法(除了跟踪最后一个元素是什么之外)是使用std::set来测试当前元素在向量的元素中是否唯一 - 到目前为止,并将唯一索引填充为你去。这提供了一次传递来收集第一个唯一元素出现的索引,例如
#include <iostream>
#include <vector>
#include <set>
int main (void) {
std::vector<int> v = { 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 5, 5, 5, 5, 5, 5 },
uniqueidx{};
std::set<int> s{};
for (size_t i = 0; i < v.size(); i++)
if (s.insert(v[i]).second)
uniqueidx.push_back(i);
for (const auto i : uniqueidx)
std::cout << i << '\n';
}
Run Code Online (Sandbox Code Playgroud)
使用/输出示例
$ ./bin/set_index_of_unique_in_vector
0
3
7
10
11
Run Code Online (Sandbox Code Playgroud)
(注意:最后两个值是10and 11,而不是9and 10- 您在向量初始化中缺少一个值,例如3, ,4)
如果你只是想要一个简单的旧循环来做同样的事情,你可以使用:
#include <iostream>
#include <vector>
int main (void) {
std::vector<int> v = { 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 5, 5, 5, 5, 5, 5 },
uniqueidx{};
for (size_t i = 0; i < v.size(); i++)
if (!i || v[i-1] != v[i])
uniqueidx.push_back(i);
for (const auto i : uniqueidx)
std::cout << i << '\n';
}
Run Code Online (Sandbox Code Playgroud)
(相同的输出)
该方法的好处std::set是您可以通过简单的循环将唯一性的确定留给std::set,这取决于您......
仔细检查一下,如果有疑问请告诉我。