方法1: インデックスの配列を使用する方法 この方法では、ソートする前の要素のインデックスを追跡するために、別のインデックスの配列を使用します。次のようなコードを使用できます:
#include <iostream>
#include <vector>
#include <algorithm>
struct IndexedElement {
int index;
int value;
};
bool compareIndexedElements(const IndexedElement& a, const IndexedElement& b) {
return a.value < b.value;
}
int main() {
std::vector<int> elements = {5, 2, 8, 1, 9};
std::vector<IndexedElement> indexedElements;
// インデックスの配列を作成する
for (int i = 0; i < elements.size(); ++i) {
indexedElements.push_back({i, elements[i]});
}
// インデックスの配列をソートする
std::sort(indexedElements.begin(), indexedElements.end(), compareIndexedElements);
// ソートされた結果を表示する
for (const auto& indexedElement : indexedElements) {
std::cout << "Index: " << indexedElement.index << ", Value: " << indexedElement.value << std::endl;
}
return 0;
}
方法2: 構造体を使用する方法 この方法では、要素とそのインデックスを1つの構造体にまとめます。次のようなコードを使用できます:
#include <iostream>
#include <vector>
#include <algorithm>
struct Element {
int index;
int value;
bool operator<(const Element& other) const {
return value < other.value;
}
};
int main() {
std::vector<Element> elements = {{0, 5}, {1, 2}, {2, 8}, {3, 1}, {4, 9}};
// 要素をソートする
std::sort(elements.begin(), elements.end());
// ソートされた結果を表示する
for (const auto& element : elements) {
std::cout << "Index: " << element.index << ", Value: " << element.value << std::endl;
}
return 0;
}
方法3: マップを使用する方法 この方法では、要素をキーとしてインデックスをマップに格納します。次のようなコードを使用できます:
#include <iostream>
#include <vector>
#include <map>
int main() {
std::vector<int> elements = {5, 2, 8, 1, 9};
std::map<int, int> indexedElements;
// インデックスをマップに格納する
for (int i = 0; i < elements.size(); ++i) {
indexedElements[elements[i]] = i;
}
// 要素をソートする
std::sort(elements.begin(), elements.end());
// ソートされた結果とインデックスを表示する
for (const auto& element : elements) {
std::cout << "Index: " << indexedElements[element] << ", Value: " << element << std::endl;
}
return 0;
}
これらの方法を使用することで、C++で要素のソートとインデックスの追跡が可能です。必要に応じて、これらのコード例を参考にして実際のプログラムに組み込んでください。