Sorting CvWString in vector - Colonization

jfgagnon

Chieftain
Joined
Jul 19, 2012
Messages
27
Hi,

I'm trying to modify the "Assign Trade Route" dialog in Colonization.

Colonization generates a list of lines of text that I want to sort alphabetically.

The data I'm interested in is in

Code:
std::vector< std::pair<int, CvWString> > aTradeRoutes;

and filled in CvDLLButtonPopup.cpp (line 2538)

in the sub

Code:
bool CvDLLButtonPopup::launchTradeRoutesPopup(CvPopup* pPopup, CvPopupInfo &info)

(snip)

Code:
	std::vector< std::pair<int, CvWString> > aTradeRoutes;
	std::vector<CvTradeRoute*> aiRoutes;
	kPlayer.getTradeRoutes(aiRoutes);
	for (uint i = 0; i < aiRoutes.size(); ++i)
	{
		CvTradeRoute* pTradeRoute = aiRoutes[i];
		if (pGroup->canAssignTradeRoute(pTradeRoute->getID(), i != 0))
		{
			CvWString szText = gDLL->getText("TXT_KEY_TRADE_ROUTE_DESCRIPTION", GC.getYieldInfo(pTradeRoute->getYield()).getTextKeyWide(), pTradeRoute->getSourceCityNameKey(), pTradeRoute->getDestinationCityNameKey());
			aTradeRoutes.push_back(std::make_pair(pTradeRoute->getID(), szText));
		}
	}

Is there a way (inserting new code after that block) to sort aTradeRoutes alphabetically by the second "member"?

CvString.h doesn't contain any reference to any sorting function.

I have some experience in Python programming, but not in C++.

Thanks

JFG
 
So yes, it is possible!

By defining a comparison function with the "data type" used by the aTradeRoutes variable, we can use the "sort" function.

Code:
// JFG July 2012
	bool compare_by_aTradeRoutes(const std::pair<int, CvWString>& lhs, const std::pair<int, CvWString>& rhs) 
	{
		// Function used for the std::sort
		return lhs.second < rhs.second;
	}
//

After aTradeRoutes is filled, we can sort it.

Code:
	// JFG July 2012
	std::sort(aTradeRoutes.begin(),aTradeRoutes.end(),compare_by_aTradeRoutes);
	// JFG End

It works! (For now...)

JFG
 
Top Bottom