2016-07-22 77 views
2

如果我的代碼:如何迭代變量?

T a; 
T b; 
T c; 
// ... 
T z; 

如何,我可以遍歷它們,而無需創建他們的std::vector<T&>

任何漂亮的解決方案,像(僞):

for (auto& it : [a, b, c, d, e, f]) { 
    // ... 
} 

(無複印件)

+0

你甚至不能創建'std :: vector '。 – juanchopanza

+0

一般你不能。您可以創建一個包含變量值*副本的臨時向量。 –

+0

@JoachimPileborg - 這會複製變量,是嗎? –

回答

9
for (auto& var : {std::ref(a), std::ref(b), std::ref(c), std::ref(d), std::ref(e), std::ref(f)}) { 
    // ... 
} 

應該做的工作。

+1

是否有任何理由不會簡單地寫'for(auto it:{&a,&b,&c})...' ? –

+0

@ H.Guijt:要有一個更透明的用法(你必須解除引用),但它是一個有效的選擇。 – Jarod42

2

如果你不想實際修改「變量」,那麼你也許可以做到像

// TODO: Put your own variables here, in the order you want them 
auto variables = { a, b, c, .... }; 

// Concatenate all strings 
std::string result = std::accumulate(std::begin(variables), std::end(variables), "", 
    [](std::string const& first, std::string const& second) 
    { 
     return first + ' ' + second; // To add spacing 
    }); 

注意,這需要所有的「變量」是同一類型(std::string)的。如果您有一個不是字符串的變量,您可以使用std::to_string在第一步中對其進行轉換。

+0

你的'initializer_list'做了一個副本。 – Jarod42

+0

@ Jarod42在大多數情況下,它真的沒什麼好擔心的。我們不知道OP的用例,如果OP每秒多次這樣做,那麼可能是一個問題。如果OP在10小時的運行時間內執行一次或兩次,那麼這是非常不重要的。這是關於上下文(我們沒有)。如果這被認爲是一個瓶頸,那麼可以使用'std :: cref'代替。 –

+0

OP明確指出,*「(無副本)」*。但我在實踐中大多同意。 – Jarod42