Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在二维向量上使用STL算法提取第一列_C++_Algorithm_Vector_Stl_Transform - Fatal编程技术网

C++ 在二维向量上使用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

我正在努力学习使用更多的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::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