C++ 在二维向量上使用STL算法提取第一列
我正在努力学习使用更多的STL算法。我很难确定是否有更标准的方法来编写以下代码C++ 在二维向量上使用STL算法提取第一列,c++,algorithm,vector,stl,transform,C++,Algorithm,Vector,Stl,Transform,我正在努力学习使用更多的STL算法。我很难确定是否有更标准的方法来编写以下代码 std::vector<std::vector<std::string>> myVec; std::vector<std::string> myInnerVec; for(int y=0;y < myVec.size();y++){ myInnerVec.emplace_back(myVec[y][0]); } std::vector myVec; std::vec
std::vector<std::vector<std::string>> myVec;
std::vector<std::string> myInnerVec;
for(int y=0;y < myVec.size();y++){
myInnerVec.emplace_back(myVec[y][0]);
}
std::vector myVec;
std::vector myInnerVec;
对于(int y=0;y
这里我从向量myVec中提取第一列并将其放入myInnerVec中。这段代码可以用STL魔术来改进吗?当然可以<代码>标准::转换应该做你想做的事 (未测试代码):
transform(myVec.begin(),myVec.end(),
返回插入迭代器(myInnerVec),
[](常量向量&v){返回v[0];});
这可能是:
std::transform(cbegin(myVec)、cend(myVec)、std::back_插入器(myInnerVex),[](const auto&row){return row[0];});
注意,您应该调用
myInnerVex.reserve(myVec.size())代码>事先。或者,您可以编写自己的迭代器,该迭代器包含一个迭代器并始终返回*it[0]
例如,您可以使用标准算法std::transform
这是一个演示程序
#include <iostream>
#include <string>
#include<vector>
#include <iterator>
#include <algorithm>
int main()
{
std::vector<std::vector<std::string>> v =
{
{ "A", "B", "C" },
{ "D", "E", "F" }
};
std::vector<std::vector<std::string>>::size_type column;
auto l = [&column = column]( const auto &row )
{
return row[column];
};
column = 0;
std::vector<std::string> v1;
v1.reserve( v.size() );
std::transform( std::begin( v ), std::end( v ), std::back_inserter( v1 ), l );
for ( const auto &item : v1 ) std::cout << item << ' ';
std::cout << '\n';
column = 1;
std::transform( std::begin( v ), std::end( v ), std::begin( v1 ), l );
for ( const auto &item : v1 ) std::cout << item << ' ';
std::cout << '\n';
return 0;
}
你不能存储myVec
transposed吗?在myVec[y][0]
上循环不是最方便缓存的。您真的需要第一列的副本吗?这不需要类似的循环吗?我想按原样存储myVec,这样我就可以通过返回myVec[y]@Freebi32来提取行。你需要一个锯齿状数组吗,也就是说,每个列都可以有不同的大小?循环看起来很相似,但不会像这样在内存中到处跳跃。vector最大的优点是数据局部性,但由于vector使用堆分配,vector
没有数据局部性
#include <iostream>
#include <string>
#include<vector>
#include <iterator>
#include <algorithm>
int main()
{
std::vector<std::vector<std::string>> v =
{
{ "A", "B", "C" },
{ "D", "E", "F" }
};
std::vector<std::vector<std::string>>::size_type column;
auto l = [&column = column]( const auto &row )
{
return row[column];
};
column = 0;
std::vector<std::string> v1;
v1.reserve( v.size() );
std::transform( std::begin( v ), std::end( v ), std::back_inserter( v1 ), l );
for ( const auto &item : v1 ) std::cout << item << ' ';
std::cout << '\n';
column = 1;
std::transform( std::begin( v ), std::end( v ), std::begin( v1 ), l );
for ( const auto &item : v1 ) std::cout << item << ' ';
std::cout << '\n';
return 0;
}
A D
B E