可视化地从c++向量中指定的索引中提取元素
visual extracting the elements from specified indexes in c++ vector
我有两个问题,我们将高度重视任何帮助。
我有一个矩阵A ={ 0 1 0 0 1 1 0 0}
。现在我找到了0的索引的位置,并保存在向量B={0 2 3 6 7}
中。
-
如何在不损坏原始向量A的情况下,将A中向量B索引的元素提取到新向量?即,我想得到
C= {0 0 0 0 0}
,它是来自A的数据,由B索引。 -
如何擦除由B索引的A中的元素?
我试过这样回答第二题,但没有成功。
///// erasing the elements in particular locations
sort (B.begin(), B.end());
for(int i=A.size() - 1; i >= 0; i--){
A.erase(A.begin() + B[i]);
}
1.如何在不损坏原始向量A的情况下,对A中由向量B索引的元素进行extarct?即,我想得到C={0 0 0 0},这是来自A的数据,由B索引。
std::vector<int> C;
for (size_t i = 0; i < B.size(); ++i )
C.push_back(A[B[i]]);
当然,我们假设B
没有超出A
向量边界的条目。
Q1:
如果你很乐意制作一个新的矢量,PaulMcKenzie的答案就是你想要的:
std::vector<int> C;
for (size_t i = 0; i < B.size(); ++i )
C.push_back(A[B[i]]);
第二季度:
否则,您需要删除每个未被B
索引的实例。这是相对复杂的,因为通过以您的方式删除一个条目,您可以强制重新定位,它可以/(将?)使迭代器/指向数据的指针无效。
可能最好的解决方案(简单高效)是在上面创建一个临时向量C
,然后在.中交换减少的数据
void delete_indexes(std::vector<int> &data, std::vector<int> &indexes)
{
std::vector<int> temp;
for (size_t i = 0; i < indexes.size(); ++i )
{
temp.push_back(data[indexes[i]]);
}
data.swap(temp); //does the work
}
int main()
{
//do stuff
delete_indexes(A,B);
}
交换选项很快(只是交换,而不是删除和写入),并且当临时矢量超出范围时(与原始数据一起)会被处理掉。
编辑:
这个答案也可能是你想要的,假设你有一个生成B
的每个元素的函数,你可以应用它(即使它是A[i] == 1
(根据需要编辑的代码):
for(auto it = A.begin(); it != A.end();)
{
if (criteria_for_B(*it))
it = A.erase(it);
else
++it;
}
对我来说,我使用擦除函数,但有一个计数器来定义迭代器:
#include <iostream>
#include <vector>
using namespace std;
int main(){
vector<int> A;
A.push_back(0);
A.push_back(1);
A.push_back(0);
A.push_back(0);
A.push_back(1);
A.push_back(1);
A.push_back(0);
A.push_back(0);
vector<int> B;
B.push_back(0);
B.push_back(2);
B.push_back(3);
B.push_back(6);
B.push_back(7);
for(int i=0; i<A.size(); i++){
cout << A[i] << "-";
}
cout << endl;
vector<int> C = A;
int ii=0;
for(int i=0; i<B.size(); i++){
C.erase(C.begin() -ii + B[i] );
ii++;
}
for(int i=0; i<C.size(); i++){
cout << C[i] << "-";
}
}
你可以像我一样使用第三个矢量,也可以直接修改a.
我希望这对你有帮助!
以下是一些std-syle通用实用程序(标准c++98)。
1.提取索引处的元素
/// Extract elements from vector at indices specified by range
template <typename ForwardIt, typename IndicesForwardIt>
inline std::vector<typename std::iterator_traits<ForwardIt>::value_type>
extract_at(
ForwardIt first,
IndicesForwardIt indices_first,
IndicesForwardIt indices_last)
{
typedef std::vector<typename std::iterator_traits<ForwardIt>::value_type>
vector_type;
vector_type extracted;
extracted.reserve(static_cast<typename vector_type::size_type>(
std::distance(indices_first, indices_last)));
for(; indices_first != indices_last; ++indices_first)
extracted.push_back(*(first + *indices_first));
return extracted;
}
/// Extract elements from collection specified by collection of indices
template <typename TVector, typename TIndicesVector>
inline TVector extract_at(const TVector& data, const TIndicesVector& indices)
{
return extract_at(data.begin(), indices.begin(), indices.end());
}
2.删除索引处的元素
//! Remove one element with given index from the range [first; last)
template <typename ForwardIt>
inline ForwardIt remove_at(ForwardIt first, ForwardIt last, const size_t index)
{
std::advance(first, index);
for(ForwardIt it = first + 1; it != last; ++it, ++first)
*first = *it;
return first;
}
/*!
* Remove elements in the range [first; last) with indices from the sorted
* range [indices_first, indices_last)
*/
template <typename ForwardIt, typename SortedIndicesForwardIt>
inline ForwardIt remove_at(
ForwardIt first,
ForwardIt last,
SortedIndicesForwardIt indices_first,
SortedIndicesForwardIt indices_last)
{
typedef typename std::vector<bool> flags;
// flag elements to keep
flags is_keep(
static_cast<flags::size_type>(std::distance(first, last)), true);
for(; indices_first != indices_last; ++indices_first)
is_keep[static_cast<flags::size_type>(*indices_first)] = false;
// move kept elements to beginning
ForwardIt result = first;
for(flags::const_iterator it = is_keep.begin(); first != last; ++first, ++it)
if(*it) // keep element
*result++ = *first; //in c++11 and later use: *result++ = std::move(*first);
return result;
}
用法(擦除-删除习语):
std::vector<int> vec{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
std::vector<int> ii{6, 3, 1};
std::sort(ii.begin(), ii.end());
vec.erase(remove_at(vec.begin(), vec.end(), ii.begin(), ii.end()), vec.end());
相关文章:
- 数组索引的值没有增加
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 芬威克树(BIT).找到具有给定累积频率的最小索引,单位为 O(logN)
- 如何从 std::atomic 中提取指针 T<T>?
- 为什么istream不支持右值提取
- 查找最接近的大于当前数字的数字的索引
- 在C++中调整向量中的索引
- 重载元组索引运算符-C++
- 给定一个向量,如何找到该向量的所有子集和的原始索引
- 如何设置一个范围来提取我想要获得的信息
- 为std::string的某个索引赋值
- 并行用于C++17中数组索引范围内的循环
- 根据索引值提取特定字节
- QRegExp提取数组名称和索引
- 使用犰狳根据行和列索引从矩阵中提取元素
- 在Boost :: Dynamic_bitset中提取设置的位索引
- 如何从Eigen中的索引向量中提取子向量(Eigen::Vector)
- 可视化地从c++向量中指定的索引中提取元素
- 如何从结构中提取索引最高的专门化
- 从固定数组中提取随机索引