我有以下向量,v = [ 9 2 9 5]
和它的唯一元素c = [2 5 9]
按升序排列。我希望提取向量u = [3 1 3 2]
。 u
向量包含向量c
中唯一元素的索引,以便重构向量v
。
我的想法是迭代v
并借助于基于c
的唯一值构造的哈希表来获取索引值。这有意义吗?如果是的话,请问有人在c++
提出建议吗?其他建议值得高度赞赏(我对高效实施感兴趣,因为v
和c
矩阵足够大)。
祝你好运, 透特
答案 0 :(得分:7)
索引从0开始。所以编写
会更正确u = {2,0,2,1};
您可以使用标准算法来完成任务。例如(这里我假设矢量c已经以某种方式构建)
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
int main()
{
std::vector<int> v = { 9, 2, 9, 5 };
std::vector<int> c = { 2, 5, 9 };
std::vector<int> u;
u.reserve( v.size() );
std::transform( v.begin(), v.end(), std::back_inserter( u ),
[&]( int x )
{
return ( std::distance( c.begin(),
std::lower_bound( c.begin(), c.end(), x ) ) );
} );
for ( int x : u ) std::cout << x << ' ';
std::cout << std::endl;
}
如果您需要从vector v获取唯一值,则可以使用std::set<int>
代替std::vector<int>
。例如
#include <iostream>
#include <vector>
#include <set>
#include <iterator>
#include <algorithm>
int main()
{
std::vector<int> v = { 9, 2, 9, 5 };
std::set<int> c( v.begin(), v.end() );
std::vector<int> u;
u.reserve( v.size() );
std::transform( v.begin(), v.end(), std::back_inserter( u ),
[&]( int x )
{
return ( std::distance( c.begin(), c.find( x ) ) );
} );
for ( int x : u ) std::cout << x << ' ';
std::cout << std::endl;
}