2014-09-27 39 views
8

當一個const向量處理,下面不工作:標準庫中boost :: make_transform_iterator的等效參數是什麼?

const std::vector<std::string> v; 
v.push_back("test"); // error: v cannot be modified 

相反,你必須初始化上它的架構相同線路的載體。然而,即使有這樣的限制,boost::make_transform_iterator可以輕鬆地做其推入v在另一個載體的元素的東西在這個例子中,convert是返回輸入元素的變換版本一元函數:

auto beg = boost::make_transform_iterator(args.begin(), convert); 
auto end = boost::make_transform_iterator(args.end(), convert); 

const std::vector<const char*> vc { beg, end }; 

我查看了<iterator>中的可用功能,但沒有看到相應的功能。它是簡單的丟失還是有一個原因,爲什麼標準庫沒有它?

+3

如果有一個等價的,這很可能會被稱爲'的std :: make_transform_iterator'。沒有一個。 boost(和其他庫)中有許多有用的東西不在標準庫中。 – 2014-09-27 10:07:19

+0

你試圖做什麼並不明顯。也許'const std :: vector v = {「hello」,「world」};'? – 2014-09-27 10:16:55

+0

@Marc不,我希望'vc'避免被修改,因爲它會被'c_str()'填充,如果'vc'調整大小或者類似的東西,我讀過的可能導致失效的指針。所以我試圖在一行上初始化它,而不必在第二行使用std :: transform。 – user4085715 2014-09-27 10:20:11

回答

3

對於C++ 11總是有拉姆達就地初始化招

const auto vc = [&]{ 
    std::vector<const char*> tmp(v.size()); 
    std::transform(v.begin(), v.end(), tmp.begin(), convert); 
    return tmp; 
}(); 

const auto vc = [&]{ 
    std::vector<const char*> tmp; 
    tmp.reserve(v.size()); 
    std::transform(v.begin(), v.end(), back_inserter(tmp), convert); 
    return tmp; 
}(); 

看到它Live On Coliru

這是說,我寧願升壓範圍適配器:(還有Live On Coliru

const auto vc = boost::copy_range<std::vector<const char*> >(v | transformed(convert)); 
#include <algorithm> 
#include <vector> 
#include <iterator> 
#include <string> 

#include <functional> 
#include <iostream> 

int main() 
{ 
    const std::vector</* const */ std::string> v { "test", "goodbye" }; 

    auto convert = std::mem_fn(&std::string::c_str); 

    const auto vc = [&]{ 
     std::vector<const char*> tmp; 
     tmp.reserve(v.size()); 
     std::transform(v.begin(), v.end(), back_inserter(tmp), convert); 
     return tmp; 
    }(); 

    for (auto cc : vc) 
     std::cout << cc << "\n"; 
} 
+0

我相信開始「const auto vc = boost :: copy_range ...」的代碼行與以'''#include'''語句開頭的代碼塊沒有關係,並且這兩個意圖是分開的方法,你更喜歡前者。那是對的嗎? – Alan 2016-09-27 15:28:26

+0

@Alan正確。升壓範圍適配器允許您基本上在同一行中說相同的東西 – sehe 2016-09-27 15:42:35

+0

我相應地編輯了答案。謝謝。 – Alan 2016-09-27 17:36:27

相關問題