Compare smaller vector to bigger to check if it differs at the end of smaller
We have two vectors of size that depends on runtime and need to check if they are equal - differ elements only after the end of smaller size vector. I used std::equal but the issue is that I need to find first which vector is of smaller size which leads to extra line of code :
#include <vector>
#include <iostream>
int main()
{
std::vector<int> a(1000, 3);
std::vector<int> a1(100, 3);
if(a.size() > a1.size())
{
if(std::equal(a1.begin(), a1.end(), a.begin()))
{
std::cout << "Same a gt a1" << std::endl;
}
}
if(a1.size() > a.size())
{
if(std::equal(a.begin(), a.end(), a1.begin()))
{
std::cout << "Same a1 gt a" << std::endl;
}
}
if(a1.size() == a.size())
{
if(std::equal(a.begin(), a.end(), a1.begin()))
{
std::cout << "Same a = a1" << std::endl;
}
}
}
Can the code to compare two vectors or differ only at the end of smaller vector be improved?
c++ c++11
add a comment |
We have two vectors of size that depends on runtime and need to check if they are equal - differ elements only after the end of smaller size vector. I used std::equal but the issue is that I need to find first which vector is of smaller size which leads to extra line of code :
#include <vector>
#include <iostream>
int main()
{
std::vector<int> a(1000, 3);
std::vector<int> a1(100, 3);
if(a.size() > a1.size())
{
if(std::equal(a1.begin(), a1.end(), a.begin()))
{
std::cout << "Same a gt a1" << std::endl;
}
}
if(a1.size() > a.size())
{
if(std::equal(a.begin(), a.end(), a1.begin()))
{
std::cout << "Same a1 gt a" << std::endl;
}
}
if(a1.size() == a.size())
{
if(std::equal(a.begin(), a.end(), a1.begin()))
{
std::cout << "Same a = a1" << std::endl;
}
}
}
Can the code to compare two vectors or differ only at the end of smaller vector be improved?
c++ c++11
C++11 only? No C++14 by any chance?
– StoryTeller
Dec 20 '18 at 8:20
1
If you don't have an actual problem (like performance requirement your current code does not meet, not necessarily a bug), just want code review, then there is codereview.stackexchange.com
– hyde
Dec 20 '18 at 14:25
add a comment |
We have two vectors of size that depends on runtime and need to check if they are equal - differ elements only after the end of smaller size vector. I used std::equal but the issue is that I need to find first which vector is of smaller size which leads to extra line of code :
#include <vector>
#include <iostream>
int main()
{
std::vector<int> a(1000, 3);
std::vector<int> a1(100, 3);
if(a.size() > a1.size())
{
if(std::equal(a1.begin(), a1.end(), a.begin()))
{
std::cout << "Same a gt a1" << std::endl;
}
}
if(a1.size() > a.size())
{
if(std::equal(a.begin(), a.end(), a1.begin()))
{
std::cout << "Same a1 gt a" << std::endl;
}
}
if(a1.size() == a.size())
{
if(std::equal(a.begin(), a.end(), a1.begin()))
{
std::cout << "Same a = a1" << std::endl;
}
}
}
Can the code to compare two vectors or differ only at the end of smaller vector be improved?
c++ c++11
We have two vectors of size that depends on runtime and need to check if they are equal - differ elements only after the end of smaller size vector. I used std::equal but the issue is that I need to find first which vector is of smaller size which leads to extra line of code :
#include <vector>
#include <iostream>
int main()
{
std::vector<int> a(1000, 3);
std::vector<int> a1(100, 3);
if(a.size() > a1.size())
{
if(std::equal(a1.begin(), a1.end(), a.begin()))
{
std::cout << "Same a gt a1" << std::endl;
}
}
if(a1.size() > a.size())
{
if(std::equal(a.begin(), a.end(), a1.begin()))
{
std::cout << "Same a1 gt a" << std::endl;
}
}
if(a1.size() == a.size())
{
if(std::equal(a.begin(), a.end(), a1.begin()))
{
std::cout << "Same a = a1" << std::endl;
}
}
}
Can the code to compare two vectors or differ only at the end of smaller vector be improved?
c++ c++11
c++ c++11
edited Dec 20 '18 at 13:39
sbecker
26719
26719
asked Dec 20 '18 at 8:10
ProgrammerProgrammer
2,9051750103
2,9051750103
C++11 only? No C++14 by any chance?
– StoryTeller
Dec 20 '18 at 8:20
1
If you don't have an actual problem (like performance requirement your current code does not meet, not necessarily a bug), just want code review, then there is codereview.stackexchange.com
– hyde
Dec 20 '18 at 14:25
add a comment |
C++11 only? No C++14 by any chance?
– StoryTeller
Dec 20 '18 at 8:20
1
If you don't have an actual problem (like performance requirement your current code does not meet, not necessarily a bug), just want code review, then there is codereview.stackexchange.com
– hyde
Dec 20 '18 at 14:25
C++11 only? No C++14 by any chance?
– StoryTeller
Dec 20 '18 at 8:20
C++11 only? No C++14 by any chance?
– StoryTeller
Dec 20 '18 at 8:20
1
1
If you don't have an actual problem (like performance requirement your current code does not meet, not necessarily a bug), just want code review, then there is codereview.stackexchange.com
– hyde
Dec 20 '18 at 14:25
If you don't have an actual problem (like performance requirement your current code does not meet, not necessarily a bug), just want code review, then there is codereview.stackexchange.com
– hyde
Dec 20 '18 at 14:25
add a comment |
3 Answers
3
active
oldest
votes
You only need one call of std::equal
if you calculate the smaller size beforehand. I would refactor the code like this:
#include <vector>
#include <iostream>
#include <algorithm>
int main()
{
std::vector<int> a(1000, 3);
std::vector<int> a1(100, 3);
if (std::equal(a1.begin(), a1.begin() + std::min(a.size(), a1.size()), a.begin()))
{
std::cout << "Same" << std::endl;
}
return 0;
}
If you need to preserve the second information about which vector is bigger, you could achieve it like this, for instance:
std::cout << "Same " << ((a.size() == a1.size())? "a = a1" : ((a.size() > a1.size())? "a gt a1" : "a1 gt a")) << std::endl;
2
I'd suggest usingconst auto size = std::min(a.size(), a1.size());
. This also doesn't perform an unsigned to signed conversion.
– lubgr
Dec 20 '18 at 8:17
Great idea, added it to the post.
– Blaze
Dec 20 '18 at 8:18
1
The above does not include the 2nd information, e.g. if one of the vector is longer than the other, which the user is distinguishing.
– Fabio
Dec 20 '18 at 8:20
Good point, I added that as an alternative.
– Blaze
Dec 20 '18 at 8:27
Also possible to eliminate the variablesize
by doingif (std::equal(a1.begin(), a1.begin() + std::min(a.size(), a1.size()), a.begin())) ...
– Peter
Dec 20 '18 at 9:17
add a comment |
Since C++14, you can use std::mismatch
and check the pair of iterators returned against the end of each range:
auto it = std::mismatch(a.begin(), a.end(), a1.begin(), a1.end());
if (it.first == a.end() || it.second == a1.end()) {
// Equality
}
You also get to know where the elements start to differ, and if they don't, at which point the bigger vector is bigger (the start of the subrange you don't want to compare).
3
The exact semantic information the OP wanted in a single algorithm. +1
– StoryTeller
Dec 20 '18 at 8:41
2
Very nice. I did not know that this algorithm existed. +1
– P.W
Dec 20 '18 at 8:51
add a comment |
Here is a pure C++11 solution that should work for any sequential container (e.g. std::vector
, std::list
, std::deque
). It uses a custom return type, as the type of comparison you show in the original snippets carries more information than a simple boolean value can incorporate.
enum class CombinedCompareResult {
NotEqual, EqualAndFirstLarger, EqualAndSecondLarger, EqualIncludingSize
};
template <class Rng1, class Rng2>
CombinedCompareResult combinedCompare(const Rng1& rng1, const Rng2& rng2)
{
using std::begin;
const auto elementsToCompare = std::min(rng1.size(), rng2.size());
if (!std::equal(begin(rng1), std::next(begin(rng1), elementsToCompare), begin(rng2)))
return CombinedCompareResult::NotEqual;
else if (rng1.size() == rng2.size())
return CombinedCompareResult::EqualIncludingSize;
else if (rng1.size() > rng2.size())
return CombinedCompareResult::EqualAndFirstLarger;
else
return CombinedCompareResult::EqualAndSecondLarger;
}
This can be used like the following and should result in the identical behavior as the code in the question.
const auto cmp = combinedCompare(lst, a);
if (cmp == CombinedCompareResult::EqualIncludingSize)
std::cout << "Same a = a1" << std::endl;
else if (cmp == CombinedCompareResult::EqualAndFirstLarger)
std::cout << "Same a gt a1" << std::endl;
else if (cmp == CombinedCompareResult::EqualAndSecondLarger)
std::cout << "Same a1 gt a" << std::endl;
add a comment |
Your Answer
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: "1"
};
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: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
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
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53864663%2fcompare-smaller-vector-to-bigger-to-check-if-it-differs-at-the-end-of-smaller%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
You only need one call of std::equal
if you calculate the smaller size beforehand. I would refactor the code like this:
#include <vector>
#include <iostream>
#include <algorithm>
int main()
{
std::vector<int> a(1000, 3);
std::vector<int> a1(100, 3);
if (std::equal(a1.begin(), a1.begin() + std::min(a.size(), a1.size()), a.begin()))
{
std::cout << "Same" << std::endl;
}
return 0;
}
If you need to preserve the second information about which vector is bigger, you could achieve it like this, for instance:
std::cout << "Same " << ((a.size() == a1.size())? "a = a1" : ((a.size() > a1.size())? "a gt a1" : "a1 gt a")) << std::endl;
2
I'd suggest usingconst auto size = std::min(a.size(), a1.size());
. This also doesn't perform an unsigned to signed conversion.
– lubgr
Dec 20 '18 at 8:17
Great idea, added it to the post.
– Blaze
Dec 20 '18 at 8:18
1
The above does not include the 2nd information, e.g. if one of the vector is longer than the other, which the user is distinguishing.
– Fabio
Dec 20 '18 at 8:20
Good point, I added that as an alternative.
– Blaze
Dec 20 '18 at 8:27
Also possible to eliminate the variablesize
by doingif (std::equal(a1.begin(), a1.begin() + std::min(a.size(), a1.size()), a.begin())) ...
– Peter
Dec 20 '18 at 9:17
add a comment |
You only need one call of std::equal
if you calculate the smaller size beforehand. I would refactor the code like this:
#include <vector>
#include <iostream>
#include <algorithm>
int main()
{
std::vector<int> a(1000, 3);
std::vector<int> a1(100, 3);
if (std::equal(a1.begin(), a1.begin() + std::min(a.size(), a1.size()), a.begin()))
{
std::cout << "Same" << std::endl;
}
return 0;
}
If you need to preserve the second information about which vector is bigger, you could achieve it like this, for instance:
std::cout << "Same " << ((a.size() == a1.size())? "a = a1" : ((a.size() > a1.size())? "a gt a1" : "a1 gt a")) << std::endl;
2
I'd suggest usingconst auto size = std::min(a.size(), a1.size());
. This also doesn't perform an unsigned to signed conversion.
– lubgr
Dec 20 '18 at 8:17
Great idea, added it to the post.
– Blaze
Dec 20 '18 at 8:18
1
The above does not include the 2nd information, e.g. if one of the vector is longer than the other, which the user is distinguishing.
– Fabio
Dec 20 '18 at 8:20
Good point, I added that as an alternative.
– Blaze
Dec 20 '18 at 8:27
Also possible to eliminate the variablesize
by doingif (std::equal(a1.begin(), a1.begin() + std::min(a.size(), a1.size()), a.begin())) ...
– Peter
Dec 20 '18 at 9:17
add a comment |
You only need one call of std::equal
if you calculate the smaller size beforehand. I would refactor the code like this:
#include <vector>
#include <iostream>
#include <algorithm>
int main()
{
std::vector<int> a(1000, 3);
std::vector<int> a1(100, 3);
if (std::equal(a1.begin(), a1.begin() + std::min(a.size(), a1.size()), a.begin()))
{
std::cout << "Same" << std::endl;
}
return 0;
}
If you need to preserve the second information about which vector is bigger, you could achieve it like this, for instance:
std::cout << "Same " << ((a.size() == a1.size())? "a = a1" : ((a.size() > a1.size())? "a gt a1" : "a1 gt a")) << std::endl;
You only need one call of std::equal
if you calculate the smaller size beforehand. I would refactor the code like this:
#include <vector>
#include <iostream>
#include <algorithm>
int main()
{
std::vector<int> a(1000, 3);
std::vector<int> a1(100, 3);
if (std::equal(a1.begin(), a1.begin() + std::min(a.size(), a1.size()), a.begin()))
{
std::cout << "Same" << std::endl;
}
return 0;
}
If you need to preserve the second information about which vector is bigger, you could achieve it like this, for instance:
std::cout << "Same " << ((a.size() == a1.size())? "a = a1" : ((a.size() > a1.size())? "a gt a1" : "a1 gt a")) << std::endl;
edited Dec 20 '18 at 9:26
answered Dec 20 '18 at 8:15
BlazeBlaze
4,7171628
4,7171628
2
I'd suggest usingconst auto size = std::min(a.size(), a1.size());
. This also doesn't perform an unsigned to signed conversion.
– lubgr
Dec 20 '18 at 8:17
Great idea, added it to the post.
– Blaze
Dec 20 '18 at 8:18
1
The above does not include the 2nd information, e.g. if one of the vector is longer than the other, which the user is distinguishing.
– Fabio
Dec 20 '18 at 8:20
Good point, I added that as an alternative.
– Blaze
Dec 20 '18 at 8:27
Also possible to eliminate the variablesize
by doingif (std::equal(a1.begin(), a1.begin() + std::min(a.size(), a1.size()), a.begin())) ...
– Peter
Dec 20 '18 at 9:17
add a comment |
2
I'd suggest usingconst auto size = std::min(a.size(), a1.size());
. This also doesn't perform an unsigned to signed conversion.
– lubgr
Dec 20 '18 at 8:17
Great idea, added it to the post.
– Blaze
Dec 20 '18 at 8:18
1
The above does not include the 2nd information, e.g. if one of the vector is longer than the other, which the user is distinguishing.
– Fabio
Dec 20 '18 at 8:20
Good point, I added that as an alternative.
– Blaze
Dec 20 '18 at 8:27
Also possible to eliminate the variablesize
by doingif (std::equal(a1.begin(), a1.begin() + std::min(a.size(), a1.size()), a.begin())) ...
– Peter
Dec 20 '18 at 9:17
2
2
I'd suggest using
const auto size = std::min(a.size(), a1.size());
. This also doesn't perform an unsigned to signed conversion.– lubgr
Dec 20 '18 at 8:17
I'd suggest using
const auto size = std::min(a.size(), a1.size());
. This also doesn't perform an unsigned to signed conversion.– lubgr
Dec 20 '18 at 8:17
Great idea, added it to the post.
– Blaze
Dec 20 '18 at 8:18
Great idea, added it to the post.
– Blaze
Dec 20 '18 at 8:18
1
1
The above does not include the 2nd information, e.g. if one of the vector is longer than the other, which the user is distinguishing.
– Fabio
Dec 20 '18 at 8:20
The above does not include the 2nd information, e.g. if one of the vector is longer than the other, which the user is distinguishing.
– Fabio
Dec 20 '18 at 8:20
Good point, I added that as an alternative.
– Blaze
Dec 20 '18 at 8:27
Good point, I added that as an alternative.
– Blaze
Dec 20 '18 at 8:27
Also possible to eliminate the variable
size
by doing if (std::equal(a1.begin(), a1.begin() + std::min(a.size(), a1.size()), a.begin())) ...
– Peter
Dec 20 '18 at 9:17
Also possible to eliminate the variable
size
by doing if (std::equal(a1.begin(), a1.begin() + std::min(a.size(), a1.size()), a.begin())) ...
– Peter
Dec 20 '18 at 9:17
add a comment |
Since C++14, you can use std::mismatch
and check the pair of iterators returned against the end of each range:
auto it = std::mismatch(a.begin(), a.end(), a1.begin(), a1.end());
if (it.first == a.end() || it.second == a1.end()) {
// Equality
}
You also get to know where the elements start to differ, and if they don't, at which point the bigger vector is bigger (the start of the subrange you don't want to compare).
3
The exact semantic information the OP wanted in a single algorithm. +1
– StoryTeller
Dec 20 '18 at 8:41
2
Very nice. I did not know that this algorithm existed. +1
– P.W
Dec 20 '18 at 8:51
add a comment |
Since C++14, you can use std::mismatch
and check the pair of iterators returned against the end of each range:
auto it = std::mismatch(a.begin(), a.end(), a1.begin(), a1.end());
if (it.first == a.end() || it.second == a1.end()) {
// Equality
}
You also get to know where the elements start to differ, and if they don't, at which point the bigger vector is bigger (the start of the subrange you don't want to compare).
3
The exact semantic information the OP wanted in a single algorithm. +1
– StoryTeller
Dec 20 '18 at 8:41
2
Very nice. I did not know that this algorithm existed. +1
– P.W
Dec 20 '18 at 8:51
add a comment |
Since C++14, you can use std::mismatch
and check the pair of iterators returned against the end of each range:
auto it = std::mismatch(a.begin(), a.end(), a1.begin(), a1.end());
if (it.first == a.end() || it.second == a1.end()) {
// Equality
}
You also get to know where the elements start to differ, and if they don't, at which point the bigger vector is bigger (the start of the subrange you don't want to compare).
Since C++14, you can use std::mismatch
and check the pair of iterators returned against the end of each range:
auto it = std::mismatch(a.begin(), a.end(), a1.begin(), a1.end());
if (it.first == a.end() || it.second == a1.end()) {
// Equality
}
You also get to know where the elements start to differ, and if they don't, at which point the bigger vector is bigger (the start of the subrange you don't want to compare).
edited Dec 20 '18 at 8:43
answered Dec 20 '18 at 8:37
NelfealNelfeal
5,119825
5,119825
3
The exact semantic information the OP wanted in a single algorithm. +1
– StoryTeller
Dec 20 '18 at 8:41
2
Very nice. I did not know that this algorithm existed. +1
– P.W
Dec 20 '18 at 8:51
add a comment |
3
The exact semantic information the OP wanted in a single algorithm. +1
– StoryTeller
Dec 20 '18 at 8:41
2
Very nice. I did not know that this algorithm existed. +1
– P.W
Dec 20 '18 at 8:51
3
3
The exact semantic information the OP wanted in a single algorithm. +1
– StoryTeller
Dec 20 '18 at 8:41
The exact semantic information the OP wanted in a single algorithm. +1
– StoryTeller
Dec 20 '18 at 8:41
2
2
Very nice. I did not know that this algorithm existed. +1
– P.W
Dec 20 '18 at 8:51
Very nice. I did not know that this algorithm existed. +1
– P.W
Dec 20 '18 at 8:51
add a comment |
Here is a pure C++11 solution that should work for any sequential container (e.g. std::vector
, std::list
, std::deque
). It uses a custom return type, as the type of comparison you show in the original snippets carries more information than a simple boolean value can incorporate.
enum class CombinedCompareResult {
NotEqual, EqualAndFirstLarger, EqualAndSecondLarger, EqualIncludingSize
};
template <class Rng1, class Rng2>
CombinedCompareResult combinedCompare(const Rng1& rng1, const Rng2& rng2)
{
using std::begin;
const auto elementsToCompare = std::min(rng1.size(), rng2.size());
if (!std::equal(begin(rng1), std::next(begin(rng1), elementsToCompare), begin(rng2)))
return CombinedCompareResult::NotEqual;
else if (rng1.size() == rng2.size())
return CombinedCompareResult::EqualIncludingSize;
else if (rng1.size() > rng2.size())
return CombinedCompareResult::EqualAndFirstLarger;
else
return CombinedCompareResult::EqualAndSecondLarger;
}
This can be used like the following and should result in the identical behavior as the code in the question.
const auto cmp = combinedCompare(lst, a);
if (cmp == CombinedCompareResult::EqualIncludingSize)
std::cout << "Same a = a1" << std::endl;
else if (cmp == CombinedCompareResult::EqualAndFirstLarger)
std::cout << "Same a gt a1" << std::endl;
else if (cmp == CombinedCompareResult::EqualAndSecondLarger)
std::cout << "Same a1 gt a" << std::endl;
add a comment |
Here is a pure C++11 solution that should work for any sequential container (e.g. std::vector
, std::list
, std::deque
). It uses a custom return type, as the type of comparison you show in the original snippets carries more information than a simple boolean value can incorporate.
enum class CombinedCompareResult {
NotEqual, EqualAndFirstLarger, EqualAndSecondLarger, EqualIncludingSize
};
template <class Rng1, class Rng2>
CombinedCompareResult combinedCompare(const Rng1& rng1, const Rng2& rng2)
{
using std::begin;
const auto elementsToCompare = std::min(rng1.size(), rng2.size());
if (!std::equal(begin(rng1), std::next(begin(rng1), elementsToCompare), begin(rng2)))
return CombinedCompareResult::NotEqual;
else if (rng1.size() == rng2.size())
return CombinedCompareResult::EqualIncludingSize;
else if (rng1.size() > rng2.size())
return CombinedCompareResult::EqualAndFirstLarger;
else
return CombinedCompareResult::EqualAndSecondLarger;
}
This can be used like the following and should result in the identical behavior as the code in the question.
const auto cmp = combinedCompare(lst, a);
if (cmp == CombinedCompareResult::EqualIncludingSize)
std::cout << "Same a = a1" << std::endl;
else if (cmp == CombinedCompareResult::EqualAndFirstLarger)
std::cout << "Same a gt a1" << std::endl;
else if (cmp == CombinedCompareResult::EqualAndSecondLarger)
std::cout << "Same a1 gt a" << std::endl;
add a comment |
Here is a pure C++11 solution that should work for any sequential container (e.g. std::vector
, std::list
, std::deque
). It uses a custom return type, as the type of comparison you show in the original snippets carries more information than a simple boolean value can incorporate.
enum class CombinedCompareResult {
NotEqual, EqualAndFirstLarger, EqualAndSecondLarger, EqualIncludingSize
};
template <class Rng1, class Rng2>
CombinedCompareResult combinedCompare(const Rng1& rng1, const Rng2& rng2)
{
using std::begin;
const auto elementsToCompare = std::min(rng1.size(), rng2.size());
if (!std::equal(begin(rng1), std::next(begin(rng1), elementsToCompare), begin(rng2)))
return CombinedCompareResult::NotEqual;
else if (rng1.size() == rng2.size())
return CombinedCompareResult::EqualIncludingSize;
else if (rng1.size() > rng2.size())
return CombinedCompareResult::EqualAndFirstLarger;
else
return CombinedCompareResult::EqualAndSecondLarger;
}
This can be used like the following and should result in the identical behavior as the code in the question.
const auto cmp = combinedCompare(lst, a);
if (cmp == CombinedCompareResult::EqualIncludingSize)
std::cout << "Same a = a1" << std::endl;
else if (cmp == CombinedCompareResult::EqualAndFirstLarger)
std::cout << "Same a gt a1" << std::endl;
else if (cmp == CombinedCompareResult::EqualAndSecondLarger)
std::cout << "Same a1 gt a" << std::endl;
Here is a pure C++11 solution that should work for any sequential container (e.g. std::vector
, std::list
, std::deque
). It uses a custom return type, as the type of comparison you show in the original snippets carries more information than a simple boolean value can incorporate.
enum class CombinedCompareResult {
NotEqual, EqualAndFirstLarger, EqualAndSecondLarger, EqualIncludingSize
};
template <class Rng1, class Rng2>
CombinedCompareResult combinedCompare(const Rng1& rng1, const Rng2& rng2)
{
using std::begin;
const auto elementsToCompare = std::min(rng1.size(), rng2.size());
if (!std::equal(begin(rng1), std::next(begin(rng1), elementsToCompare), begin(rng2)))
return CombinedCompareResult::NotEqual;
else if (rng1.size() == rng2.size())
return CombinedCompareResult::EqualIncludingSize;
else if (rng1.size() > rng2.size())
return CombinedCompareResult::EqualAndFirstLarger;
else
return CombinedCompareResult::EqualAndSecondLarger;
}
This can be used like the following and should result in the identical behavior as the code in the question.
const auto cmp = combinedCompare(lst, a);
if (cmp == CombinedCompareResult::EqualIncludingSize)
std::cout << "Same a = a1" << std::endl;
else if (cmp == CombinedCompareResult::EqualAndFirstLarger)
std::cout << "Same a gt a1" << std::endl;
else if (cmp == CombinedCompareResult::EqualAndSecondLarger)
std::cout << "Same a1 gt a" << std::endl;
answered Dec 20 '18 at 8:43
lubgrlubgr
10.4k21745
10.4k21745
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- 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.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53864663%2fcompare-smaller-vector-to-bigger-to-check-if-it-differs-at-the-end-of-smaller%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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
C++11 only? No C++14 by any chance?
– StoryTeller
Dec 20 '18 at 8:20
1
If you don't have an actual problem (like performance requirement your current code does not meet, not necessarily a bug), just want code review, then there is codereview.stackexchange.com
– hyde
Dec 20 '18 at 14:25