簡體   English   中英

C ++向量被另一個向量索引

[英]c++ vector indexing by another vector

很想問這個顯然很簡單的問題,但是我找不到我問題的確切答案,而且我顯然沒有經驗,無法從類似問題中得出答案...

假設我有以下情況

#include <vector>

int main() {
    std::cout << "Test" << std::endl;

    int myints1[] = {1, 1 , 0, 0};
    std::vector<int> vec1 (myints1, myints1 + sizeof(myints) / sizeof(int) );
    int myints2[] = {1, 2 , 3, 4};
    std::vector<int> vec2 (myints, myints2 + sizeof(myints2) / sizeof(int) );

    std::vector<int> resultVec;

    // Now as a result I want to get the resultVec as all entries in vec2 
    // where vec1 == 0, resulting in resultVec = [3,4]
    return 0

}

如何通過另一個向量的值選擇一個向量的所有條目?

僅在索引上循環就可以解決問題。 此代碼假定vec2的大小至少與vec1一樣大。

int main() {
    std::cout << "Test" << std::endl;

    int myints1[] = {1, 1 , 0, 0};
    std::vector<int> vec1 (myints1, myints1 + sizeof(myints) / sizeof(int) );
    int myints2[] = {1, 2 , 3, 4};
    std::vector<int> vec2 (myints, myints2 + sizeof(myints2) / sizeof(int) );

    std::vector<int> resultVec;

    for (unsigned i = 0; i < vec1.size(); ++i) {
        if (!vec1[i]) resultVec.push_back(vec2[i]);
    }
    return 0

}

您可以有一個遞增兩個迭代器的循環。 因為您的集合是相同的類型,所以您可以在for中對它們進行貼花,並且由於它們的大小相同,因此您只需要檢查其中一個即可。

for (auto it1 = vec1.begin(), it2 = vec2.begin(); it1 != vec1.end(); ++it1, ++it2) 
{
     // Use *it1 and *it2
}

如果您可以使用C ++ 17和boost,則可以使用

for (auto & [val1, val2] : boost::combine(vec1, vec2))
{
     // Use val1 and val2
}

請注意,您可以使用{}初始化vector ,因此我不會為myints

std::vector<int> vec1 = {1, 1, 0, 0};
std::vector<int> vec2 = {1, 2, 3, 4};

暫無
暫無

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

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