intersection of two sorted vectors in C++





.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ margin-bottom:0;
}







4












$begingroup$


intersection of two sorted vectors in C++, can this be written any better.



vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
vector<int> result;
int l = 0, r = 0;
while(l < nums1.size() && r < nums2.size()){
int left = nums1[l], right = nums2[r];
if(left == right){
result.push_back(right);
while(l < nums1.size() && nums1[l] == left )l++;
while(r < nums2.size() && nums2[r] == right )r++;
continue;
}
if(left < right){
while(l < nums1.size() && nums1[l] == left )l++;
}else while( r < nums2.size() && nums2[r] == right )r++;
}
return result;
}









share|improve this question











$endgroup$








  • 4




    $begingroup$
    Do you know about std::set_intersection()? Reference and example implementations: en.cppreference.com/w/cpp/algorithm/set_intersection
    $endgroup$
    – user673679
    8 hours ago






  • 2




    $begingroup$
    @user673679 yes I did, and didn't want to use it;
    $endgroup$
    – Rick
    8 hours ago


















4












$begingroup$


intersection of two sorted vectors in C++, can this be written any better.



vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
vector<int> result;
int l = 0, r = 0;
while(l < nums1.size() && r < nums2.size()){
int left = nums1[l], right = nums2[r];
if(left == right){
result.push_back(right);
while(l < nums1.size() && nums1[l] == left )l++;
while(r < nums2.size() && nums2[r] == right )r++;
continue;
}
if(left < right){
while(l < nums1.size() && nums1[l] == left )l++;
}else while( r < nums2.size() && nums2[r] == right )r++;
}
return result;
}









share|improve this question











$endgroup$








  • 4




    $begingroup$
    Do you know about std::set_intersection()? Reference and example implementations: en.cppreference.com/w/cpp/algorithm/set_intersection
    $endgroup$
    – user673679
    8 hours ago






  • 2




    $begingroup$
    @user673679 yes I did, and didn't want to use it;
    $endgroup$
    – Rick
    8 hours ago














4












4








4





$begingroup$


intersection of two sorted vectors in C++, can this be written any better.



vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
vector<int> result;
int l = 0, r = 0;
while(l < nums1.size() && r < nums2.size()){
int left = nums1[l], right = nums2[r];
if(left == right){
result.push_back(right);
while(l < nums1.size() && nums1[l] == left )l++;
while(r < nums2.size() && nums2[r] == right )r++;
continue;
}
if(left < right){
while(l < nums1.size() && nums1[l] == left )l++;
}else while( r < nums2.size() && nums2[r] == right )r++;
}
return result;
}









share|improve this question











$endgroup$




intersection of two sorted vectors in C++, can this be written any better.



vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
vector<int> result;
int l = 0, r = 0;
while(l < nums1.size() && r < nums2.size()){
int left = nums1[l], right = nums2[r];
if(left == right){
result.push_back(right);
while(l < nums1.size() && nums1[l] == left )l++;
while(r < nums2.size() && nums2[r] == right )r++;
continue;
}
if(left < right){
while(l < nums1.size() && nums1[l] == left )l++;
}else while( r < nums2.size() && nums2[r] == right )r++;
}
return result;
}






c++ reinventing-the-wheel






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited 5 hours ago









user673679

3,33911129




3,33911129










asked 10 hours ago









RickRick

308112




308112








  • 4




    $begingroup$
    Do you know about std::set_intersection()? Reference and example implementations: en.cppreference.com/w/cpp/algorithm/set_intersection
    $endgroup$
    – user673679
    8 hours ago






  • 2




    $begingroup$
    @user673679 yes I did, and didn't want to use it;
    $endgroup$
    – Rick
    8 hours ago














  • 4




    $begingroup$
    Do you know about std::set_intersection()? Reference and example implementations: en.cppreference.com/w/cpp/algorithm/set_intersection
    $endgroup$
    – user673679
    8 hours ago






  • 2




    $begingroup$
    @user673679 yes I did, and didn't want to use it;
    $endgroup$
    – Rick
    8 hours ago








4




4




$begingroup$
Do you know about std::set_intersection()? Reference and example implementations: en.cppreference.com/w/cpp/algorithm/set_intersection
$endgroup$
– user673679
8 hours ago




$begingroup$
Do you know about std::set_intersection()? Reference and example implementations: en.cppreference.com/w/cpp/algorithm/set_intersection
$endgroup$
– user673679
8 hours ago




2




2




$begingroup$
@user673679 yes I did, and didn't want to use it;
$endgroup$
– Rick
8 hours ago




$begingroup$
@user673679 yes I did, and didn't want to use it;
$endgroup$
– Rick
8 hours ago










2 Answers
2






active

oldest

votes


















10












$begingroup$


  • Indentation


Your indentation is not consistent. This makes the code hard to read and maintain. It should be fixed so you don't give other people headaches.



        if(left < right){
while(l < nums1.size() && nums1[l] == left )l++;
}else while( r < nums2.size() && nums2[r] == right )r++;


That is basically unreadable giberish (opinion of Martin).






  • Using namespace std; is super bad


This is mention in nearly every C++ review. There is a large article on the subject here: Why is “using namespace std” considered bad practice? the second answer is the best in my opinion (Martin) see






  • Multiple declarations in one is bad (thanks to terrible syntax binding rules)


The one declaration per line has been written about adnausium in best practice guides. Please for the sake of your reader declare one variable per line with its own exact type.



The syntax binding rules alluded to above is:



int* x, y;   // here x is int* and y in int
// confusing to a reader. Did you really mean to make y an int?
// Avoid this problem be declaring one variable per line





  • Typically, functions like this would be based on iterators to work on any container


Here your code is limited to only using vectors. But the algorithm you are using could be used by any container type with only small modifications. As a result your function could provide mcuh more utility being written to use iterators.



The standard library was written such that iterators are the glue between algorithms and container.






  • It would be a lot simpler if not necessarily more efficient at runtime to just use some hash sets

  • This function could be generic in T rather than assuming int

  • The repeated conditions make me feel like there's simplification waiting here, although exactly what that is eludes me in the two minutes I'm spending on this

  • Should take by const ref, not ref, so that you can operate on temporaries






share|improve this answer











$endgroup$









  • 1




    $begingroup$
    You caught the problems and I voted you up, but you could improve your answer by explaining what the issue for the first 4 bullet items.
    $endgroup$
    – pacmaninbw
    9 hours ago






  • 1




    $begingroup$
    @pacmaninbw: Added some context.
    $endgroup$
    – Martin York
    6 hours ago



















6












$begingroup$

I invite you to review @DeadMG's answer.



Rewriting following (most of) his advice, you'd get something like:



#include <cassert>
#include <algorithm>
#include <vector>

std::vector<T> intersection(std::vector<T> const& left_vector, std::vector<T> const& right_vector) {
auto left = left_vector.begin();
auto left_end = left_vector.end();
auto right = right_vector.begin();
auto right_end = right_vector.end();

assert(std::is_sorted(left, left_end));
assert(std::is_sorted(right, right_end));

std::vector<T> result;

while (left != left_end && right != right_end) {
if (*left == *right) {
result.push_back(*left);
++left;
++right;
continue;
}

if (*left < *right) {
++left;
continue;
}

assert(*left > *right);
++right;
}

return result;
}


I've always found taking pairs of iterators awkward, so I would not recommend such an interface. Instead, you could take simply take any "iterable", they need not even have the same value type, so long as they are comparable:



template <typename Left, typename Right>
std::vector<typename Left::value_type> intersection(Left const& left_c, Right const& right_c);


Also, note that I've included some assert to validate the pre-conditions of the methods (the collections must be sorted) as well as internal invariants (if *left is neither equal nor strictly less than *right then it must be strictly greater).



I encourage you to use assert liberally:




  • They document intentions: pre-conditions, invariants, etc...

  • They check that those intentions hold.


Documentation & Bug detection rolled in one, with no run-time (Release) cost.






share|improve this answer









$endgroup$









  • 1




    $begingroup$
    Why don't you post that as its own questions. There are some improvements even if we don't move to iterators like using template template types.
    $endgroup$
    – Martin York
    6 hours ago






  • 1




    $begingroup$
    @MartinYork: I generally don't find "template template" to be an improvement, they're quite awkward to use, and tend to constrain the inputs more than intended.
    $endgroup$
    – Matthieu M.
    6 hours ago










  • $begingroup$
    @MatthieuM. You should reconsider the solution you posted.
    $endgroup$
    – Rick
    1 hour ago












Your Answer





StackExchange.ifUsing("editor", function () {
return StackExchange.using("mathjaxEditing", function () {
StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
});
});
}, "mathjax-editing");

StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "196"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f216861%2fintersection-of-two-sorted-vectors-in-c%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























2 Answers
2






active

oldest

votes








2 Answers
2






active

oldest

votes









active

oldest

votes






active

oldest

votes









10












$begingroup$


  • Indentation


Your indentation is not consistent. This makes the code hard to read and maintain. It should be fixed so you don't give other people headaches.



        if(left < right){
while(l < nums1.size() && nums1[l] == left )l++;
}else while( r < nums2.size() && nums2[r] == right )r++;


That is basically unreadable giberish (opinion of Martin).






  • Using namespace std; is super bad


This is mention in nearly every C++ review. There is a large article on the subject here: Why is “using namespace std” considered bad practice? the second answer is the best in my opinion (Martin) see






  • Multiple declarations in one is bad (thanks to terrible syntax binding rules)


The one declaration per line has been written about adnausium in best practice guides. Please for the sake of your reader declare one variable per line with its own exact type.



The syntax binding rules alluded to above is:



int* x, y;   // here x is int* and y in int
// confusing to a reader. Did you really mean to make y an int?
// Avoid this problem be declaring one variable per line





  • Typically, functions like this would be based on iterators to work on any container


Here your code is limited to only using vectors. But the algorithm you are using could be used by any container type with only small modifications. As a result your function could provide mcuh more utility being written to use iterators.



The standard library was written such that iterators are the glue between algorithms and container.






  • It would be a lot simpler if not necessarily more efficient at runtime to just use some hash sets

  • This function could be generic in T rather than assuming int

  • The repeated conditions make me feel like there's simplification waiting here, although exactly what that is eludes me in the two minutes I'm spending on this

  • Should take by const ref, not ref, so that you can operate on temporaries






share|improve this answer











$endgroup$









  • 1




    $begingroup$
    You caught the problems and I voted you up, but you could improve your answer by explaining what the issue for the first 4 bullet items.
    $endgroup$
    – pacmaninbw
    9 hours ago






  • 1




    $begingroup$
    @pacmaninbw: Added some context.
    $endgroup$
    – Martin York
    6 hours ago
















10












$begingroup$


  • Indentation


Your indentation is not consistent. This makes the code hard to read and maintain. It should be fixed so you don't give other people headaches.



        if(left < right){
while(l < nums1.size() && nums1[l] == left )l++;
}else while( r < nums2.size() && nums2[r] == right )r++;


That is basically unreadable giberish (opinion of Martin).






  • Using namespace std; is super bad


This is mention in nearly every C++ review. There is a large article on the subject here: Why is “using namespace std” considered bad practice? the second answer is the best in my opinion (Martin) see






  • Multiple declarations in one is bad (thanks to terrible syntax binding rules)


The one declaration per line has been written about adnausium in best practice guides. Please for the sake of your reader declare one variable per line with its own exact type.



The syntax binding rules alluded to above is:



int* x, y;   // here x is int* and y in int
// confusing to a reader. Did you really mean to make y an int?
// Avoid this problem be declaring one variable per line





  • Typically, functions like this would be based on iterators to work on any container


Here your code is limited to only using vectors. But the algorithm you are using could be used by any container type with only small modifications. As a result your function could provide mcuh more utility being written to use iterators.



The standard library was written such that iterators are the glue between algorithms and container.






  • It would be a lot simpler if not necessarily more efficient at runtime to just use some hash sets

  • This function could be generic in T rather than assuming int

  • The repeated conditions make me feel like there's simplification waiting here, although exactly what that is eludes me in the two minutes I'm spending on this

  • Should take by const ref, not ref, so that you can operate on temporaries






share|improve this answer











$endgroup$









  • 1




    $begingroup$
    You caught the problems and I voted you up, but you could improve your answer by explaining what the issue for the first 4 bullet items.
    $endgroup$
    – pacmaninbw
    9 hours ago






  • 1




    $begingroup$
    @pacmaninbw: Added some context.
    $endgroup$
    – Martin York
    6 hours ago














10












10








10





$begingroup$


  • Indentation


Your indentation is not consistent. This makes the code hard to read and maintain. It should be fixed so you don't give other people headaches.



        if(left < right){
while(l < nums1.size() && nums1[l] == left )l++;
}else while( r < nums2.size() && nums2[r] == right )r++;


That is basically unreadable giberish (opinion of Martin).






  • Using namespace std; is super bad


This is mention in nearly every C++ review. There is a large article on the subject here: Why is “using namespace std” considered bad practice? the second answer is the best in my opinion (Martin) see






  • Multiple declarations in one is bad (thanks to terrible syntax binding rules)


The one declaration per line has been written about adnausium in best practice guides. Please for the sake of your reader declare one variable per line with its own exact type.



The syntax binding rules alluded to above is:



int* x, y;   // here x is int* and y in int
// confusing to a reader. Did you really mean to make y an int?
// Avoid this problem be declaring one variable per line





  • Typically, functions like this would be based on iterators to work on any container


Here your code is limited to only using vectors. But the algorithm you are using could be used by any container type with only small modifications. As a result your function could provide mcuh more utility being written to use iterators.



The standard library was written such that iterators are the glue between algorithms and container.






  • It would be a lot simpler if not necessarily more efficient at runtime to just use some hash sets

  • This function could be generic in T rather than assuming int

  • The repeated conditions make me feel like there's simplification waiting here, although exactly what that is eludes me in the two minutes I'm spending on this

  • Should take by const ref, not ref, so that you can operate on temporaries






share|improve this answer











$endgroup$




  • Indentation


Your indentation is not consistent. This makes the code hard to read and maintain. It should be fixed so you don't give other people headaches.



        if(left < right){
while(l < nums1.size() && nums1[l] == left )l++;
}else while( r < nums2.size() && nums2[r] == right )r++;


That is basically unreadable giberish (opinion of Martin).






  • Using namespace std; is super bad


This is mention in nearly every C++ review. There is a large article on the subject here: Why is “using namespace std” considered bad practice? the second answer is the best in my opinion (Martin) see






  • Multiple declarations in one is bad (thanks to terrible syntax binding rules)


The one declaration per line has been written about adnausium in best practice guides. Please for the sake of your reader declare one variable per line with its own exact type.



The syntax binding rules alluded to above is:



int* x, y;   // here x is int* and y in int
// confusing to a reader. Did you really mean to make y an int?
// Avoid this problem be declaring one variable per line





  • Typically, functions like this would be based on iterators to work on any container


Here your code is limited to only using vectors. But the algorithm you are using could be used by any container type with only small modifications. As a result your function could provide mcuh more utility being written to use iterators.



The standard library was written such that iterators are the glue between algorithms and container.






  • It would be a lot simpler if not necessarily more efficient at runtime to just use some hash sets

  • This function could be generic in T rather than assuming int

  • The repeated conditions make me feel like there's simplification waiting here, although exactly what that is eludes me in the two minutes I'm spending on this

  • Should take by const ref, not ref, so that you can operate on temporaries







share|improve this answer














share|improve this answer



share|improve this answer








edited 6 hours ago









Martin York

74.2k488272




74.2k488272










answered 10 hours ago









DeadMGDeadMG

749612




749612








  • 1




    $begingroup$
    You caught the problems and I voted you up, but you could improve your answer by explaining what the issue for the first 4 bullet items.
    $endgroup$
    – pacmaninbw
    9 hours ago






  • 1




    $begingroup$
    @pacmaninbw: Added some context.
    $endgroup$
    – Martin York
    6 hours ago














  • 1




    $begingroup$
    You caught the problems and I voted you up, but you could improve your answer by explaining what the issue for the first 4 bullet items.
    $endgroup$
    – pacmaninbw
    9 hours ago






  • 1




    $begingroup$
    @pacmaninbw: Added some context.
    $endgroup$
    – Martin York
    6 hours ago








1




1




$begingroup$
You caught the problems and I voted you up, but you could improve your answer by explaining what the issue for the first 4 bullet items.
$endgroup$
– pacmaninbw
9 hours ago




$begingroup$
You caught the problems and I voted you up, but you could improve your answer by explaining what the issue for the first 4 bullet items.
$endgroup$
– pacmaninbw
9 hours ago




1




1




$begingroup$
@pacmaninbw: Added some context.
$endgroup$
– Martin York
6 hours ago




$begingroup$
@pacmaninbw: Added some context.
$endgroup$
– Martin York
6 hours ago













6












$begingroup$

I invite you to review @DeadMG's answer.



Rewriting following (most of) his advice, you'd get something like:



#include <cassert>
#include <algorithm>
#include <vector>

std::vector<T> intersection(std::vector<T> const& left_vector, std::vector<T> const& right_vector) {
auto left = left_vector.begin();
auto left_end = left_vector.end();
auto right = right_vector.begin();
auto right_end = right_vector.end();

assert(std::is_sorted(left, left_end));
assert(std::is_sorted(right, right_end));

std::vector<T> result;

while (left != left_end && right != right_end) {
if (*left == *right) {
result.push_back(*left);
++left;
++right;
continue;
}

if (*left < *right) {
++left;
continue;
}

assert(*left > *right);
++right;
}

return result;
}


I've always found taking pairs of iterators awkward, so I would not recommend such an interface. Instead, you could take simply take any "iterable", they need not even have the same value type, so long as they are comparable:



template <typename Left, typename Right>
std::vector<typename Left::value_type> intersection(Left const& left_c, Right const& right_c);


Also, note that I've included some assert to validate the pre-conditions of the methods (the collections must be sorted) as well as internal invariants (if *left is neither equal nor strictly less than *right then it must be strictly greater).



I encourage you to use assert liberally:




  • They document intentions: pre-conditions, invariants, etc...

  • They check that those intentions hold.


Documentation & Bug detection rolled in one, with no run-time (Release) cost.






share|improve this answer









$endgroup$









  • 1




    $begingroup$
    Why don't you post that as its own questions. There are some improvements even if we don't move to iterators like using template template types.
    $endgroup$
    – Martin York
    6 hours ago






  • 1




    $begingroup$
    @MartinYork: I generally don't find "template template" to be an improvement, they're quite awkward to use, and tend to constrain the inputs more than intended.
    $endgroup$
    – Matthieu M.
    6 hours ago










  • $begingroup$
    @MatthieuM. You should reconsider the solution you posted.
    $endgroup$
    – Rick
    1 hour ago
















6












$begingroup$

I invite you to review @DeadMG's answer.



Rewriting following (most of) his advice, you'd get something like:



#include <cassert>
#include <algorithm>
#include <vector>

std::vector<T> intersection(std::vector<T> const& left_vector, std::vector<T> const& right_vector) {
auto left = left_vector.begin();
auto left_end = left_vector.end();
auto right = right_vector.begin();
auto right_end = right_vector.end();

assert(std::is_sorted(left, left_end));
assert(std::is_sorted(right, right_end));

std::vector<T> result;

while (left != left_end && right != right_end) {
if (*left == *right) {
result.push_back(*left);
++left;
++right;
continue;
}

if (*left < *right) {
++left;
continue;
}

assert(*left > *right);
++right;
}

return result;
}


I've always found taking pairs of iterators awkward, so I would not recommend such an interface. Instead, you could take simply take any "iterable", they need not even have the same value type, so long as they are comparable:



template <typename Left, typename Right>
std::vector<typename Left::value_type> intersection(Left const& left_c, Right const& right_c);


Also, note that I've included some assert to validate the pre-conditions of the methods (the collections must be sorted) as well as internal invariants (if *left is neither equal nor strictly less than *right then it must be strictly greater).



I encourage you to use assert liberally:




  • They document intentions: pre-conditions, invariants, etc...

  • They check that those intentions hold.


Documentation & Bug detection rolled in one, with no run-time (Release) cost.






share|improve this answer









$endgroup$









  • 1




    $begingroup$
    Why don't you post that as its own questions. There are some improvements even if we don't move to iterators like using template template types.
    $endgroup$
    – Martin York
    6 hours ago






  • 1




    $begingroup$
    @MartinYork: I generally don't find "template template" to be an improvement, they're quite awkward to use, and tend to constrain the inputs more than intended.
    $endgroup$
    – Matthieu M.
    6 hours ago










  • $begingroup$
    @MatthieuM. You should reconsider the solution you posted.
    $endgroup$
    – Rick
    1 hour ago














6












6








6





$begingroup$

I invite you to review @DeadMG's answer.



Rewriting following (most of) his advice, you'd get something like:



#include <cassert>
#include <algorithm>
#include <vector>

std::vector<T> intersection(std::vector<T> const& left_vector, std::vector<T> const& right_vector) {
auto left = left_vector.begin();
auto left_end = left_vector.end();
auto right = right_vector.begin();
auto right_end = right_vector.end();

assert(std::is_sorted(left, left_end));
assert(std::is_sorted(right, right_end));

std::vector<T> result;

while (left != left_end && right != right_end) {
if (*left == *right) {
result.push_back(*left);
++left;
++right;
continue;
}

if (*left < *right) {
++left;
continue;
}

assert(*left > *right);
++right;
}

return result;
}


I've always found taking pairs of iterators awkward, so I would not recommend such an interface. Instead, you could take simply take any "iterable", they need not even have the same value type, so long as they are comparable:



template <typename Left, typename Right>
std::vector<typename Left::value_type> intersection(Left const& left_c, Right const& right_c);


Also, note that I've included some assert to validate the pre-conditions of the methods (the collections must be sorted) as well as internal invariants (if *left is neither equal nor strictly less than *right then it must be strictly greater).



I encourage you to use assert liberally:




  • They document intentions: pre-conditions, invariants, etc...

  • They check that those intentions hold.


Documentation & Bug detection rolled in one, with no run-time (Release) cost.






share|improve this answer









$endgroup$



I invite you to review @DeadMG's answer.



Rewriting following (most of) his advice, you'd get something like:



#include <cassert>
#include <algorithm>
#include <vector>

std::vector<T> intersection(std::vector<T> const& left_vector, std::vector<T> const& right_vector) {
auto left = left_vector.begin();
auto left_end = left_vector.end();
auto right = right_vector.begin();
auto right_end = right_vector.end();

assert(std::is_sorted(left, left_end));
assert(std::is_sorted(right, right_end));

std::vector<T> result;

while (left != left_end && right != right_end) {
if (*left == *right) {
result.push_back(*left);
++left;
++right;
continue;
}

if (*left < *right) {
++left;
continue;
}

assert(*left > *right);
++right;
}

return result;
}


I've always found taking pairs of iterators awkward, so I would not recommend such an interface. Instead, you could take simply take any "iterable", they need not even have the same value type, so long as they are comparable:



template <typename Left, typename Right>
std::vector<typename Left::value_type> intersection(Left const& left_c, Right const& right_c);


Also, note that I've included some assert to validate the pre-conditions of the methods (the collections must be sorted) as well as internal invariants (if *left is neither equal nor strictly less than *right then it must be strictly greater).



I encourage you to use assert liberally:




  • They document intentions: pre-conditions, invariants, etc...

  • They check that those intentions hold.


Documentation & Bug detection rolled in one, with no run-time (Release) cost.







share|improve this answer












share|improve this answer



share|improve this answer










answered 6 hours ago









Matthieu M.Matthieu M.

2,1871810




2,1871810








  • 1




    $begingroup$
    Why don't you post that as its own questions. There are some improvements even if we don't move to iterators like using template template types.
    $endgroup$
    – Martin York
    6 hours ago






  • 1




    $begingroup$
    @MartinYork: I generally don't find "template template" to be an improvement, they're quite awkward to use, and tend to constrain the inputs more than intended.
    $endgroup$
    – Matthieu M.
    6 hours ago










  • $begingroup$
    @MatthieuM. You should reconsider the solution you posted.
    $endgroup$
    – Rick
    1 hour ago














  • 1




    $begingroup$
    Why don't you post that as its own questions. There are some improvements even if we don't move to iterators like using template template types.
    $endgroup$
    – Martin York
    6 hours ago






  • 1




    $begingroup$
    @MartinYork: I generally don't find "template template" to be an improvement, they're quite awkward to use, and tend to constrain the inputs more than intended.
    $endgroup$
    – Matthieu M.
    6 hours ago










  • $begingroup$
    @MatthieuM. You should reconsider the solution you posted.
    $endgroup$
    – Rick
    1 hour ago








1




1




$begingroup$
Why don't you post that as its own questions. There are some improvements even if we don't move to iterators like using template template types.
$endgroup$
– Martin York
6 hours ago




$begingroup$
Why don't you post that as its own questions. There are some improvements even if we don't move to iterators like using template template types.
$endgroup$
– Martin York
6 hours ago




1




1




$begingroup$
@MartinYork: I generally don't find "template template" to be an improvement, they're quite awkward to use, and tend to constrain the inputs more than intended.
$endgroup$
– Matthieu M.
6 hours ago




$begingroup$
@MartinYork: I generally don't find "template template" to be an improvement, they're quite awkward to use, and tend to constrain the inputs more than intended.
$endgroup$
– Matthieu M.
6 hours ago












$begingroup$
@MatthieuM. You should reconsider the solution you posted.
$endgroup$
– Rick
1 hour ago




$begingroup$
@MatthieuM. You should reconsider the solution you posted.
$endgroup$
– Rick
1 hour ago


















draft saved

draft discarded




















































Thanks for contributing an answer to Code Review Stack Exchange!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


Use MathJax to format equations. MathJax reference.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f216861%2fintersection-of-two-sorted-vectors-in-c%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

How to label and detect the document text images

Vallis Paradisi

Tabula Rosettana