在多维向量中搜索两个特定元素
Search for two specific elements in multidimensional vectors
考虑以下向量
vector<vector<string>> a_words(80000,vector<string>(3));
这是一个三维向量;
现在考虑以下元素:
Joan Williams 30
Mike Williams 40
Joan Smith 30
William Anderson 20
Sara Jon 33
基本上我想按行搜索,我想找到琼·威廉姆斯,请记住琼是第一列中的一个元素,威廉姆斯是一个元素是第二列
我应该使用"查找"功能吗? 如果是,它将如何编写,否则我应该使用哪个函数?
这里有两个演示程序,一个用于 2003 C++,另一个用于 2011 C++进行搜索
2003 C++
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <utility>
#include <functional>
struct FindName : std::unary_function<bool,
const std::pair<std::string, std::string>>
{
FindName( const std::pair<std::string, std::string> &p ) : p( p ){}
bool operator ()( const std::vector<std::string> &v ) const
{
return v.size() > 1 &&
v[0] == p.first && v[1] == p.second;
}
protected:
const std::pair<std::string, std::string> p;
};
int main()
{
const size_t N = 5;
std::vector<std::vector<std::string>> v;
v.reserve( N );
const char * initial[N][3] =
{
{ "Joan", "Williams", "30" },
{ "Mike", "Williams", "40" },
{ "Joan", "Smith", "30" },
{ "William", "Anderson", "20" },
{ "Sara", "Jon", "33" }
};
for ( size_t i = 0; i < N; i++ )
{
v.push_back( std::vector<std::string>( initial[i], initial[i] + 3 ) );
}
std::pair<std::string, std::string> p( "Joan", "Williams" );
typedef std::vector<std::vector<std::string>>::iterator iterator;
iterator it = std::find_if( v.begin(), v.end(), FindName( p ) );
if ( it != v.end() )
{
for ( std::vector<std::string>::size_type i = 0; i < it->size(); ++i )
{
std::cout << ( *it )[i] << ' ';
}
}
std::cout << std::endl;
}
2011 C++
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <utility>
int main()
{
std::vector<std::vector<std::string>> v =
{
{ "Joan", "Williams", "30" },
{ "Mike", "Williams", "40" },
{ "Joan", "Smith", "30" },
{ "William", "Anderson", "20" },
{ "Sara", "Jon", "33" }
};
std::pair<std::string, std::string> p( "Joan", "Williams" );
auto it = std::find_if( v.begin(), v.end(),
[&]( const std::vector<std::string> &row )
{
return row.size() > 1 &&
row[0] == p.first && row[1] == p.second;
} );
if ( it != v.end() )
{
for ( const auto &s : *it ) std::cout << s << ' ';
}
std::cout << std::endl;
}
这两个程序的放位是
琼·威廉姆斯 30
我强烈建议您使用带有重载相等运算符的数据结构而不是vector<string>
(特别是因为似乎第三个元素应该保存在整数中,而不是字符串中)。
无论如何,这是一种可能性:
auto iter = std::find_if( std::begin(a_words), std::end(a_words),
[] (std::vector<std::string> const& vec)
{ return vec[0] == "Joan" && vec[1] == "Williams";};
如果列表按第一列或第二列按字典顺序排序,则可以改用二叉搜索。
截至 C++11,基于范围的 for 循环将是一个简单且可读的解决方案:
for(auto r: a_words)
if(r[0] == "Joan" && r[1] == "Williams")
cout << r[0] << " " << r[1] << " " << r[2] << endl;
本质上,@Columbo的答案很好,消除了C++ 11 个功能(除了初始化):
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
int main() {
// Requires C++11
std::vector<std::vector<std::string>> words = {
{ "Joan", "Williams", "30" },
{ "Mike", "Williams", "40" },
{ "Joan", "Smith", "30" },
{ "William", "Anderson", "20" },
{ "Sara", "Jon", "33" },
};
// Below does not require C++11
struct EqualName
{
const char* first;
const char* second;
EqualName(const char* first, const char* second)
: first(first), second(second)
{}
bool operator () (const std::vector<std::string>& element) {
return element[0] == first && element[1] == second;
}
};
std::vector<std::vector<std::string>>::const_iterator
pos = std::find_if(words.begin(), words.end(), EqualName("Joan", "Smith"));
if(pos != words.end())
std::cout << (*pos)[0] << ' ' << (*pos)[1] << ' ' << (*pos)[2] << 'n';
}
相关文章:
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 高级选择排序 - 在一次迭代中搜索两个元素
- 如何仅考虑 *指针中的前两个元素
- 为什么具有两个元素的发起器语法将一个元素而不是两个元素放入字符串向量中?
- 是否可以交换在 c++ 中作为函数 func(say) 中的参数传递的 const 向量的两个元素,例如:vector<int>func (const vector<int>&
- C++ std::向量插入两个元素替代算法失败
- 数组中两个元素的最大异或
- 我无法将二维数组的两个元素的差异分配给C++中其他数组的元素?
- 一个数组可以划分的最大子数组,使得不同子数组中任意两个元素的 GCD 始终为 1?
- 找到两个相关索引,其中两个元素等于目标值
- C++ - 前两个元素之间的差异
- C :交换两个不同向量的两个元素
- C 查找两个元素中出现的次数的数量
- 如何连接向量的两个元素
- 使用STL仅对两个元素进行排序
- 使用STL交换静态数组中的两个元素
- OpenGL:在两个元素之间画一条线
- C++矢量迭代器:比较和擦除两个元素
- 试图将字符串的两个元素组合在一起会得到错误的结果(c++)
- 由 8 个或更多位置分隔的数组中两个元素的最大乘积