簡體   English   中英

在二維向量上使用 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

這是一個演示程序。

#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 

這將是一種可能性:

std::transform(cbegin(myVec), cend(myvec), std::back_inserter(myInnerVex), [] (const auto &row) {return row[0];});

請注意,您應該調用myInnerVex.reserve(myVec.size()); 預先。 或者,您可以編寫一個自己的迭代器,它包含一個迭代器並始終返回*it[0]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM