在二维向量上使用 STL 算法提取第一列
Using STL algorithms on 2D vectors to extract the first column
我正在努力学习使用更多的 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]);
}
这里我从向量 myVec 中提取第一列并将其放入 myInnerVec 中。可以使用任何 STL 魔法改进此代码吗?
当然可以。 std::transform
应该做你想做的
(未经测试的代码):
transform(myVec.begin(), myVec.end(),
back_insert_iterator<vector<string>>(myInnerVec),
[](const vector<string> &v) {return v[0];});
这种可能性是:
std::transform(cbegin(myVec), cend(myvec), std::back_inserter(myInnerVex), [] (const auto &row) {return row[0];});
请注意,您应该事先致电 myInnerVex.reserve(myVec.size());
。或者,您可以编写一个自己的迭代器,它包含一个迭代器并且始终 returns *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;
}
它的输出是
A D
B E
我正在努力学习使用更多的 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]);
}
这里我从向量 myVec 中提取第一列并将其放入 myInnerVec 中。可以使用任何 STL 魔法改进此代码吗?
当然可以。 std::transform
应该做你想做的
(未经测试的代码):
transform(myVec.begin(), myVec.end(),
back_insert_iterator<vector<string>>(myInnerVec),
[](const vector<string> &v) {return v[0];});
这种可能性是:
std::transform(cbegin(myVec), cend(myvec), std::back_inserter(myInnerVex), [] (const auto &row) {return row[0];});
请注意,您应该事先致电 myInnerVex.reserve(myVec.size());
。或者,您可以编写一个自己的迭代器,它包含一个迭代器并且始终 returns *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;
}
它的输出是
A D
B E